一.读写分离说明
1、设置说明
2、安装Mysql Proxy 在Proxy服务器上安装即可. 如果源码方式安装, 需提前安装pkg-config,libevent,glibc,lua等依赖包, 非常麻烦, 建议直接使用二进制版.
3、Mysql Proxy选项说明
管理功能选项:
代理功能选项:
其他选项:
4、数据库准备工作 (1)安装半同步补丁(建议) 读写分离不能回避的问题之一就是延迟, 可以考虑Google提供的SemiSyncReplication补丁. (2)给用户授权 在Master/Slave建立一个测试用户, 因为以后客户端发送的SQL都是通过Mysql Proxy服务器来转发, 所以要确保可以从Mysql Proxy服务器上登录MySQL主从库.
(3)在Master建立测试表
5、Mysql Proxy启动 (1)修改读写分离lua脚本 默认最小4个最大8个以上的客户端连接才会实现读写分离, 现改为最小1个最大2个:
这是因为Mysql Proxy会检测客户端连接, 当连接没有超过min_idle_connections预设值时, 不会进行读写分离, 即查询操作会发生到Master上. (2)启动Mysql Proxy 建议使用配置文件的形式启动, 注意配置文件必须是660权限, 否则无法启动. 如果有多个Slave的话, proxy-read-only-backend-addresses参数可以配置多个以逗号分隔的IP:Port从库列表.
6、客户端连接测试 (1)先停止Slave的复制进程
(2)连接Proxy端口, 插入数据
(3)多开几个客户端, 连接Proxy端口, 查询数据
如果查询不到上步新插入的数据, 说明连接到了Slave, 读写分离成功. 在同一线程再插入数据并验证:
发现insert操作成功, 但是select不出刚插入的数据, 说明同一线程也读写分离成功. 从日志中可以验证:
(4)测试完毕后, 启动Slave的复制进程
7、正式环境说明 1、Mysql Proxy当前还只是个测试版, MySQL官方还不建议用到生产环境中; 2、Mysql Proxy的rw-splitting.lua脚本在网上有很多版本, 但是最准确无误的版本仍然是源码包中所附带的rw-splitting.lua脚本, 如果有lua脚本编程基础的话, 可以在这个脚本的基础上再进行优化; 3、Mysql Proxy实际上非常不稳定, 在高并发或有错误连接的情况下, 进程很容易自动关闭, 因此打开keepalive参数让进程自动恢复是个比较好的办法, 但还是不能从根本上解决问题, 因此通常最稳妥的做法是在每个从服务器上安装一个Mysql Proxy供自身使用, 虽然比较低效但却能保证稳定性; 4、Amoeba for MySQL是一款优秀的中间件软件, 同样可以实现读写分离, 负载均衡等功能, 并且稳定性要大大超过Mysql Proxy, 建议大家用来替代Mysql Proxy, 甚至MySQL-Cluster.
二、MySQL一主多从同步配置 1.配置(3台上都一样) 在/etc目录下可能无my.cnf文件,从/user/share/mysql目录中拷贝my-medium.cnf 到/etc并修改成my.cnf [root@localhost etc]# cp /usr/share/mysql/my-medium.cnf my.cnf [root@localhost etc]# ll |grep my -rwxr-xr-x 1 root root 5204 Feb 13 22:52 my_bak -rwxr-xr-x 1 root root 4765 Jul 10 23:07 my.cnf master 上; [root@mysql101 ~]# vi /etc/my.cnf 1.修改master上的配置文件my.cnf。 在[mysqld]下添加如下字段: server-id = 1 log-bin=mysql-bin binlog-do-db=YYY //需要同步的数据库 binlog-ignore-db=mysql //被忽略的数据库 binlog-ignore-db=information-schema //被忽略的数据库 在master上为slave添加一个同步账号 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.182' identified by 'pwd123'; //在slave1上登陆成功 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.111' identified by 'pwd123'; //在slave2上登陆成功 保存后,重启master的mysql服务: service mysql restart; 用show master status命令查看日志情况 mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000087 Position: 106 Binlog_Do_DB: YYY Binlog_Ignore_DB: mysql,information-schema 1 row in set (0.00 sec) 2.修改slave1上的配置文件my.cnf。 在[mysqld]下添加如下字段 [root@mysql182 ~]# vi /etc/my.cnf server-id=182 master-host=192.168.3.101 master-user= affairlog master-password=pwd123 master-port=3306 master-connect-retry=60 replicate-do-db=YYY //同步的数据库 replicate-ignore-db=mysql //被忽略的数据库 replicate-ignore-db=information-schema //被忽略的数据库 查看Master上 master_log_file的文件名 和master_log_pos 。 mysql>change master to master_host='192.168.3.101' master_user='affairlog' master_password='pwd123' master_log_file='mysql-bin.000087' master_log_pos=1845; 保存后,重启slave的mysql服务: service mysql restart; 修改slave2上的配置文件my.cnf,和上面类似,只是把server-id改下,为了方便,我都用了相应的ip某位, so,slave2上我设置的server-id是111。 在进入两个slave机中的mysql。 mysql>start slave; mysql>show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.3.101 Master_User: affairlog Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000087 Read_Master_Log_Pos: 106 Relay_Log_File: vm111-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000087 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: YYY Replicate_Ignore_DB: mysql,information-schema 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: 106 Relay_Log_Space: 406 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: 1 row in set (0.00 sec) 如果两个slave中的Slave_IO_Running、Slave_SQL_Running状态均为Yes则表明设置成功。 Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件 Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。 三、MySQL分库分表方案:https://my.oschina.net/ydsakyclguozi/blog/199498 Mysql Proxy Lua读写分离设置一.读写分离说明
1、设置说明
2、安装Mysql Proxy 在Proxy服务器上安装即可. 如果源码方式安装, 需提前安装pkg-config,libevent,glibc,lua等依赖包, 非常麻烦, 建议直接使用二进制版.
3、Mysql Proxy选项说明
管理功能选项:
代理功能选项:
其他选项:
4、数据库准备工作 (1)安装半同步补丁(建议) 读写分离不能回避的问题之一就是延迟, 可以考虑Google提供的SemiSyncReplication补丁. (2)给用户授权 在Master/Slave建立一个测试用户, 因为以后客户端发送的SQL都是通过Mysql Proxy服务器来转发, 所以要确保可以从Mysql Proxy服务器上登录MySQL主从库.
(3)在Master建立测试表
5、Mysql Proxy启动 (1)修改读写分离lua脚本 默认最小4个最大8个以上的客户端连接才会实现读写分离, 现改为最小1个最大2个:
这是因为Mysql Proxy会检测客户端连接, 当连接没有超过min_idle_connections预设值时, 不会进行读写分离, 即查询操作会发生到Master上. (2)启动Mysql Proxy 建议使用配置文件的形式启动, 注意配置文件必须是660权限, 否则无法启动. 如果有多个Slave的话, proxy-read-only-backend-addresses参数可以配置多个以逗号分隔的IP:Port从库列表.
6、客户端连接测试 (1)先停止Slave的复制进程
(2)连接Proxy端口, 插入数据
(3)多开几个客户端, 连接Proxy端口, 查询数据
如果查询不到上步新插入的数据, 说明连接到了Slave, 读写分离成功. 在同一线程再插入数据并验证:
发现insert操作成功, 但是select不出刚插入的数据, 说明同一线程也读写分离成功. 从日志中可以验证:
(4)测试完毕后, 启动Slave的复制进程
7、正式环境说明 1、Mysql Proxy当前还只是个测试版, MySQL官方还不建议用到生产环境中; 2、Mysql Proxy的rw-splitting.lua脚本在网上有很多版本, 但是最准确无误的版本仍然是源码包中所附带的rw-splitting.lua脚本, 如果有lua脚本编程基础的话, 可以在这个脚本的基础上再进行优化; 3、Mysql Proxy实际上非常不稳定, 在高并发或有错误连接的情况下, 进程很容易自动关闭, 因此打开keepalive参数让进程自动恢复是个比较好的办法, 但还是不能从根本上解决问题, 因此通常最稳妥的做法是在每个从服务器上安装一个Mysql Proxy供自身使用, 虽然比较低效但却能保证稳定性; 4、Amoeba for MySQL是一款优秀的中间件软件, 同样可以实现读写分离, 负载均衡等功能, 并且稳定性要大大超过Mysql Proxy, 建议大家用来替代Mysql Proxy, 甚至MySQL-Cluster.
二、MySQL一主多从同步配置 1.配置(3台上都一样) 在/etc目录下可能无my.cnf文件,从/user/share/mysql目录中拷贝my-medium.cnf 到/etc并修改成my.cnf [root@localhost etc]# cp /usr/share/mysql/my-medium.cnf my.cnf [root@localhost etc]# ll |grep my -rwxr-xr-x 1 root root 5204 Feb 13 22:52 my_bak -rwxr-xr-x 1 root root 4765 Jul 10 23:07 my.cnf master 上; [root@mysql101 ~]# vi /etc/my.cnf 1.修改master上的配置文件my.cnf。 在[mysqld]下添加如下字段: server-id = 1 log-bin=mysql-bin binlog-do-db=YYY //需要同步的数据库 binlog-ignore-db=mysql //被忽略的数据库 binlog-ignore-db=information-schema //被忽略的数据库 在master上为slave添加一个同步账号 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.182' identified by 'pwd123'; //在slave1上登陆成功 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.111' identified by 'pwd123'; //在slave2上登陆成功 保存后,重启master的mysql服务: service mysql restart; 用show master status命令查看日志情况 mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000087 Position: 106 Binlog_Do_DB: YYY Binlog_Ignore_DB: mysql,information-schema 1 row in set (0.00 sec) 2.修改slave1上的配置文件my.cnf。 在[mysqld]下添加如下字段 [root@mysql182 ~]# vi /etc/my.cnf server-id=182 master-host=192.168.3.101 master-user= affairlog master-password=pwd123 master-port=3306 master-connect-retry=60 replicate-do-db=YYY //同步的数据库 replicate-ignore-db=mysql //被忽略的数据库 replicate-ignore-db=information-schema //被忽略的数据库 查看Master上 master_log_file的文件名 和master_log_pos 。 mysql>change master to master_host='192.168.3.101' master_user='affairlog' master_password='pwd123' master_log_file='mysql-bin.000087' master_log_pos=1845; 保存后,重启slave的mysql服务: service mysql restart; 修改slave2上的配置文件my.cnf,和上面类似,只是把server-id改下,为了方便,我都用了相应的ip某位, so,slave2上我设置的server-id是111。 在进入两个slave机中的mysql。 mysql>start slave; mysql>show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.3.101 Master_User: affairlog Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000087 Read_Master_Log_Pos: 106 Relay_Log_File: vm111-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000087 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: YYY Replicate_Ignore_DB: mysql,information-schema 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: 106 Relay_Log_Space: 406 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: 1 row in set (0.00 sec) 如果两个slave中的Slave_IO_Running、Slave_SQL_Running状态均为Yes则表明设置成功。 Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件 Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。 |
|
来自: 昵称25533110 > 《待分类1》