篇七:mysql主从复制、读写分离
一、主从复制的实现
1、配置 /etc/my.cnf文件
#############共同配置数据库utf-8
character-set-server = utf8
collation-server = utf8_general_ci
#############主库
vi /etc/my.cnf
log-bin=mysql-bin
server-id=1
#############从库
vi /etc/my.cnf
log-bin=mysql-bin
server-id=2
2、配置账户通讯
##### Master添加授权用户
mysql> grant replication slave on *.* to 'lgp'@'%' identified by 'lgp123';
##### 查看主库的属性,具体是“mysql-bin.xxxxxx”和port,在绑定从库的时候输入这两个值
mysql> show master status;
##### Slave绑定主库
mysql> change master to master_host='192.168.1.89',master_user='shb',master_password='shb123',master_log_file='mysql-bin.000001',master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
二、主从复制问题整理
1、Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
参考网址:http://blog.csdn.net/cug_jiang126com/article/details/46846031
解决方法:在/var/lib/mysql目录下找到auto.cnf文件,修改UUIDs
如果/var路径下不存在,以my.cnf中mysqld的文件路径查找
2、pid文件找不到引发的问题: MySQL is running but PID file could not be found 或者 mysql is not running but pid file exists 或者 mysql is not running but lock exists
##查看my.cnf文件中pid的文件路径,路径如果包含“mysqld”,确认是否存在,没有则确认“mysql”,有则改成“mysql”,xxx.pid改为 系统名.pid
vi /etc/my.cnf
##如果系统名 “lgp”
cd /var/lib/mysql
cp XXXX.pid lgp.pid
解决方法:pid文件名错误,根据日志提示的pid文件名,复制创建
##查看日志文件,在日志文件最后一行会打印 xxxxxx.pid文件 ended
cat /var/log/mysqld.log
mysqld_safe mysqld from pid file /var/lib/mysql/localhost.localdomain.pid ended
##复制 xxxxxxxx.pid
cd /var/lib/mysql
cp mysql.pid xxxxxxx.pid
##修改 /etc/my.cnf配置文件
vi /etc/my.cnf
pid-file=/var/lib/mysql/xxxxxxx.pid
3、Slave_IO_Running: Connecting
可能原因:1、确认网络互通
2、连接从库的消息出错:注意标红的地方确认数据无误
重新查看主库--show master status
从库:stop slave
change master to master_host='192.168.1.89',master_user='shb',master_password='shb123',master_log_file='mysql-bin.000001',master_log_pos=120;
三、读写分离的实现
1、下载 mysql-proxy
http://downloads.mysql.com/archives/proxy/
wget http://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
2、安装
tar -xzvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
cp -rf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy
###存放配置文件
mkdir lua
###存放日志
mkdir logs
cd mysql-proxy
cp share/doc/mysql-proxy/rw-splitting.lua lua/
cp share/doc/mysql-proxy/admin-sql.lua lua/
创建 /etc/mysql-proxy.cnf文件,存放mysql-proxy的相关配置
vi /etc/mysql-proxy.cnf
[mysql-proxy]
#运行mysql-proxy的用户
user=root
#主从数据库共有的用户
admin-username=shb
#用户的密码
admin-password=shb123
#mysql-proxy运行的ip和端口,不加端口,默认4040
proxy-address=192.168.1.60:4000
#指定读取数据的mysql的ip
proxy-read-only-backend-addresses=192.168.1.59:3306
#指定存储数据的mysql的ip
proxy-backend-addresses=192.168.1.86:3306
#指定读写分离配置文件位置
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua
#指定管理脚本
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua
#日志位置
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
#日志级别
log-level=info
#以守护进程运行
daemon=true
#mysql-proxy崩溃时,尝试重启
keepalive=true
:wq保存,配置权限
chmod 660 /etc/mysql-proxy.cnf
修改
vi lua/rw-splitting.lua
###修改位置
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, #默认超过4个连接数时,才开始读写分离,改为1
max_idle_connections = 1, #默认8,改为1
is_debug = false
}
end
3、配置结束后,启动服务
./bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
####常用操作
killall -9 mysql-proxy #关闭服务
./bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf #开启服务
ps -ef|grep mysql-proxy #查看服务进程
4、测试
在按照mysql的linux系统上测试,会用到mysql命令
###在86上连接60上的mysql-proxy服务
mysql -u shb-h 192.168.1.60 -P 4000 -pshb123
###测试新增、修改、查询
select * from test.tbl_user;
insert into test.tbl_user(id,userName) values('asdasdasda','按时大大');
四、读写分离问题整理
1、安装路径
在mysql官网上面下载最新的mysql-proxy tar.gz包

2、mysql-proxy没有操作权限

grant all privileges on *.* to shb@'%' identified by 'shb123';
flush privileges;

浙公网安备 33010602011771号