1 . 介绍
MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
· 通 过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但 修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助
rhel6
master 192.168.0.56
slave 192.168.0.71
master配置:
- yum install mysql mysql-server -y
- vim /etc/my.cnf #加入以下内容
- server-id=1 必须为1到232–1之间的一个正整数值
- log-bin=mysql-bin 启动二进制日志系统
- binlog-do-db=test 二进制需要同步的数据库名
- binlog-ignore-db=mysql 避免同步 mysql 用户配置,以免不必要的麻烦
- 1)创建同步帐户,并给予权限
- /etc/init.d/mysqld start
- mysql
- mysql> grant replication slave,reload,super on *.* to test@'192.168.0.71' identified by 'test';
- flush privileges ;
slave配置:
- yum install mysql mysql-server -y
- mysql -h 192.168.0.56 -utest -ptest 测试同步帐号是否可以使用
在/usr/share/doc/mysql-server-5.1.47/中的my-medium.cnf是mysql配置的模板,它里面介绍里两种配置slave的方式,第一种为直接在配置文件中进行配置:
- 在[mysqld]下添加一下参数
- server-id=2 从服务器 ID 号,不要和主 ID 相同,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
- master-host=192.168.0.11 指定主服务器 IP 地址
- master-user=test 指定在主服务器上可以进行同步的用户名
- master-password=test 密码
- master-port=3306 同步所用的端口
- master-connect-retry=60 断点重新连接时间
- replicate-ignore-db=mysql 屏蔽对 mysql 库的同步,以免有麻烦
- replicate-do-db=test 同步数据库名称
- service mysqld start
第二种方法为进入mysql设置,推荐第二种方法:
- vim /etc/my.cnf
- server-id=2 只写这个
- mysql
- mysql> change master to master_host='192.168.0.56', master_user='test', master_password='test';
- mysql> slave start;
- show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.0.56
- Master_User: test
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000003
- Read_Master_Log_Pos: 106
- Relay_Log_File: mysqld-relay-bin.000004
- Relay_Log_Pos: 251
- Relay_Master_Log_File: mysql-bin.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Exec_Master_Log_Pos: 106
- ********************************
可在master上做如下测试,发现在master上的修改会同步到slave上
- mysql> create table westos (
- -> user varchar(25) not null,
- -> pass varchar(25) not null
- -> );
- Query OK, 0 rows affected (0.06 sec)
- mysql> show tables;
- +----------------+
- | Tables_in_test |
- +----------------+
- | westos |
- +----------------+
- 1 row in set (0.00 sec)
- mysql> insert into westos values ('user1','123');
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into westos values ('user2','456');
- Query OK, 1 row affected (0.00 sec)
- mysql> update westos set pass=password(123) where user='user1';
- Query OK, 1 row affected, 1 warning (0.00 sec)
- Rows matched: 1 Changed: 1 Warnings: 1
- mysql>
slave上:
- Database changed
- mysql> show tables
- -> ;
- +----------------+
- | Tables_in_test |
- +----------------+
- | westos |
- +----------------+
- 1 row in set (0.00 sec)
- mysql> select * from westos;
- Empty set (0.00 sec)
- mysql> select * from westos;
- +-------+------+
- | user | pass |
- +-------+------+
- | user1 | 123 |
- +-------+------+
- 1 row in set (0.00 sec)
- mysql> select * from westos;
- +-------+------+
- | user | pass |
- +-------+------+
- | user1 | 123 |
- | user2 | 456 |
- +-------+------+
- 2 rows in set (0.00 sec)
- mysql> select * from westos;
- +-------+---------------------------+
- | user | pass |
- +-------+---------------------------+
- | user1 | *23AE809DDACAF96AF0FD78ED |
- | user2 | 456 |
- +-------+---------------------------+
- 2 rows in set (0.00 sec)
- mysql>