replication可以使数据从master服务器复制到一个或者多个slave服务器,replication默认是asynchronous的,
slaves不需要永久的连接去接受来自mater的更新操作。这就意味着updates可以发生在长距离的连接甚至是临时
的或者是间歇性的连接例如拨号服务,根据配置,你可以复制所有的数据库,或者选定的数据库或者复制数据库
里选定的表。
mysql replication的目标是:
Scale-out solutions(可扩展的解决方案):多台slaves可以提高性能,这种环境下,所有的写和更新都可以发
生在master server下,读的功能可以发生在多个salve servers下。
data security(数据安全):因为数据复制到了slave下,然后slave可以停止the replication process,所以它就
可以在不侵染mater数据的情况下进行backup service的操作。
Analytics(善于分析数据):实时的数据发生在master上,然而对于信息的分析师在多台salve上面,所以不会
影响master的任何性能。
Long-distance data distribution(远距离的数据分配):如果一个机构需要你的主数据的copy,你就可以使
用replication给他们创建一个本地的copy而且无需永久的连接在主机上,减少master的负载。
mysql的replication是一个单向的,异步的replication,mysql的cluster是一个同步的replication。但是目前的cluster
的引擎ENGINE=NDBCLUSTER的性能还是不稳定,所以目前流行的还是innodb和MyISAM存储引擎。所以用得最多
应该还是mysql replication(个人的理解,经供参考)
mysql replication里面有两种核心的replication format:Statement Based Replication (SBR),Row Based Replication
(RBR)。也有第三种选择:Mixed Based Replication (MBR)。这个和bin_log的Binary Logging Formats有着异曲同工之妙。
上述为基础理论。开始进行mysql replication的配置
第一步:两台pc:192.168.1.40 (master)
192.168.1.50 (slave)
每台安装相同版本的mysql服务器(
我这里把两台linux的iptables都关闭了,这样能让它们互连,虽然关掉防火墙,对信息安全来说是非常不好的,但是这个是一个个人实验,所以仅讲解mysql replication。以简单为主)
第二步:Setting the Replication Configuration(Replication的配置)
在master上,配置/etc/my.cnf,添加如下脚本:
- [mysqld]
- log-bin=mysql-bin
- server-id=1
复制代码 在slave上,配置/etc/my.cnf,添加如下脚本:
如上的操作,都要重启一下server。
第三步:Creating a User for Replication(为Replication创建一个用户)
在master上,配置一个新用户,可以让slave服务器能读取master服务器
- mysql> CREATE USER 'repl'@'192.168.1.50' IDENTIFIED BY 'repl';
- mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.50';
复制代码 第四步:Obtaining the Replication Master Binary Log Coordinates(获得master 二进制日志的坐标)
- mysql> FLUSH TABLES WITH READ LOCK;(锁定所有表,不让其他client对此进行写操作)
- mysql > SHOW MASTER STATUS;(获得 Master Binary Log Coordinates)
复制代码 第五步:Creating a Data Snapshot Using mysqldump(使用mysqldump获得快照)
这里需要一些讨论:
因为我们要获得基于某一个特定时刻的,数据完整性和一致性的备份集,所以有很多方法获得:
一:通过对数据库停机进行冷备份,然后启动master段的mysql,在client还没有连接进来之前。进行SHOW MASTER STATUS,获得Log Position。
二:如果master是一个需要满足365*24*7服务的数据库,我们数据就必须运行在支持Snapshot
功能的文件系统上面(如ZFS),来获得一个备份集。
具体操作思路:先FLUSH TABLES WITH READ LOCK,然后获得统一的Snapshot,再SHOW MASTER STATUS
获得精确的Log Position
三:就是我们测试实验中要使用的,使用mysqldump客户端进行快照的获得:
- mysql> FLUSH TABLES WITH READ LOCK;(锁定所有的表,使得数据一致性和完整性)
- shell> mysqldump --master-data -uroot -p zsd >zsd.sql
- mysql> UNLOCK TABLES;
复制代码 第六步:Setting Up Replication with New Master and Slaves
Import the dump file:(导入dump文件)
- shell> mysql -uroot -p -Dzsd < zsd.sql
复制代码 再进入mysql服务器,执行如下命令:匹配上面import dump file对应的bin_log日志,使得数据一致性。
- mysql>CHANGE MASTER TO
- MASTER_HOST = '192.168.1.40',(master的ip)
- MASTER_PORT = 3306,(master对应的端口)
- MSTER_USER = 'repl',(之前赋予可以replication权限的用户)
- MASTER_PASSWORD = 'repl',
- MASTER_LOG_FILE = 'mysql-bin.000004',(上面dump对应的binlog)
- MASTER_LOG_POS = 107;
- mysql> START SLAVE;(开启slave)
- mysql> show slave status\G;(查看slave状态)
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event(等待master传送event,说明正常)
- Master_Host: 192.168.1.40
- Master_User: repl
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000004(与上面的binlog一一对应)
- Read_Master_Log_Pos: 107(与上面的binlog的pos一一对应)
- Relay_Log_File: localhost-relay-bin.000002
- Relay_Log_Pos: 253
- Relay_Master_Log_File: mysql-bin.000004
- Slave_IO_Running: Yes(这个状态yes,说明正常)
- Slave_SQL_Running: Yes(这个状态yes,说明正常)
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 107
- Relay_Log_Space: 413
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 0
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 1
复制代码 测试:我的测试环境中,master服务器里有一个数据库叫zsd,里面对应一张test表,有4条记录,现在我插入一条记录,这时,slave的服务器也会对应的插入一条数据,过程是单向的,异步的。
进入master服务器,进行如下操作:
- mysql> use zsd;
- mysql> show tables;
- +---------------+
- | Tables_in_zsd |
- +---------------+
- | test |
- +---------------+
- 1 row in set (0.02 sec)
- mysql> select * From test;(这里有四条数据)
- +------+
- | id |
- +------+
- | 1 |
- | 2 |
- | 3 |
- | 4 |
- +------+
- 4 rows in set (0.02 sec)
- mysql> insert into test values(5);(插入了一条数据)
- Query OK, 1 row affected (0.00 sec)
- mysql> show master status;(查看master,发现binlog的pos发生了改变)
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000004 | 195 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
复制代码 在slave服务器,做如下操作
- mysql> show slave status\G;(再次查看slave的状态)
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.1.40
- Master_User: repl
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000004
- Read_Master_Log_Pos: 195(这里的binlog与master改变的日志一一对应,说明数据在同步)
- Relay_Log_File: localhost-relay-bin.000002
- Relay_Log_Pos: 341(这里relay_log_pos也发生了改变)
- Relay_Master_Log_File: mysql-bin.000004
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 195
- Relay_Log_Space: 501
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 0
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 1
- 1 row in set (0.00 sec)
- mysql> use zsd;
- Database changed
- mysql> select * From test;(查看数据,发现数据多了一条)
- +------+
- | id |
- +------+
- | 1 |
- | 2 |
- | 3 |
- | 4 |
- | 5 |
- +------+
- 5 rows in set (0.02 sec):
复制代码 到这里,算是mysql replication安装配置成功。