此项目需3台服务器 ip master 202 slave 203 mysqlproxy 201
关闭防火墙或者开放进程的端口号
1、主从安装mysql 版本要一致
我们装的是 mysql-5.5.30.tar.gz 这里省略…
2、修改master 和 slave mysql 配置
vi /usr/local/mysql/etc/my.cnf
master服务器配置: vi /usr/local/mysql/etc/my.cnf [mysqld] server-id=202 #设置服务器唯一的id,默认是1,我们设置ip最后一段,slave设置203 log-bin=mysql-bin # 启用二进制日志 binlog-ignore-db = mysql,information_schema #忽略写入binlog的库
slave服务器配置: vi /usr/local/mysql/etc/my.cnf [mysqld] server-id=203 replicate-do-db = abc #只同步abc库 slave-skip-errors = all #忽略因复制出现的所有错误 |
3、启动主从mysql
/etc/init.d/mysqld restart
4、在master建立账户并授权slave
mysql> mysql -u root -p123.com
mysql> GRANT REPLICATION SLAVE ON *.* to ‘sync’@‘192.168.0.203’ identified by ‘1234.com’; #replication:复制
5、查看主数据状态
1 2 3 4 5 6 |
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 263 | | | +------------------+----------+--------------+------------------+ |
6、配置从数据库
1 2 3 4 5 6 7 |
mysql> change master to -> master_host='192.168.0.202', -> master_user='sync', -> master_password='1234.com', -> master_log_file='mysql-bin.000002', -> master_log_pos=263; #Log和pos是master上随机获取的。这段也可以写到my.cnf里面。 |
7、启动slave 同步进程
mysql> start slave; |
其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。
8、验证主从同步
在主mysql创建数据库abc,再从mysql查看已经同步成功!
主库
mysql> create database abc;
mysql> show databases;
slavemysql> show databases;
如果有abc证明同步成功
如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主数据库状态
mysql> show master status;
(3)复制数据文件
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
(4)取消主数据库锁定
mysql> UNLOCK TABLES;
在201 mysqlproxy客户端操作
mysql-proxy是一个mysql代理程序,主要目的实现mysql的读写分离
软件版本:mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
这是一个通用的二进制安装包,下载地址:https://pan.baidu.com/s/1hsJmi9I
1 解压安装
tar-xvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
把刚才解压的文件夹mysql-proxy-0.8.5-linux-el6-x86-64bit 复制到/usr/local/mysql-proxy
[root@myvm mysql]# mvmysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
把/usr/local/mysql-proxy设置为root用户和root组
root@myvm local]# chown root.root mysql-proxy/ -R
2、设置
编写启动脚本mysql-proxy ,由于启动脚本用Lua写的,所以可以从其他方面找到修改即可。启动脚本这里可以下载http://pan.baidu.com/s/1bpDWFqJ 并放在/etc/init.d/下面
[root@myvm mysql]# cp mysql-proxy /etc/init.d/
修改lua脚本 如果路径不对用find / -name 文件名进行查找vim/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
min_idle_connections = 1,
max_idle_connections = 1,
注意:修改上面是修改的最小和最大启动读写分离的链接数
添加mysql-proxy的配置文件
vim /etc/sysconfig/mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD="admin"
ADMIN_ADDRESS=""
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_ADDRESS=""
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--daemon --log-level=info--log-use-syslog --plugins=proxy --plugins=admin--proxy-backend-addresses=192.168.0.202:3306--proxy-read-only-backend-addresses=192.168.0.203:3306--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
#//--daemon:以守护进程模式启动mysql-proxy
#//--proxy-backend-addresses:后端可读写的mysql服务器的地址和端口
#//--proxy-read-only-backend-addresses:后端只读mysql服务器的地址和端口
#//--proxy-lua-script:完成mysql代理功能的Lua脚本
上面的proxy-backend-addresses 后面跟上主服务器的地址,proxy-read-only-backend-addresses后面跟上从服务器的地址
对/etc/init.d/mysql-proxy进行权限设置为755
启动mysql-proxy
/etc/init.d/mysql-proxy startnetstat -anutlp|grep mysql
此为网上验证两种方法,注意修改ip地址即可,思想为在slave进行写操作时,在关闭主备服务后,备库是没有写入数据的,但是主库可以查到,由此证明读写已经进行了分离
由于需要在mysql-prxoy上面登录mysql服务器所以需要安装一个mysql客户端,如果你不在proxy上登录,那么mysql-proxy服务器连mysql客户端都不许要安装
在master上面创建一个用户
grant all on *.* to 'jack'@'%' identified by'123456'
flush privileges
登录mysql-proxy的管理端
mysql -uadmin -padmin -h mysql-proxy-ip --prot 4041
这里的用户名和密码是启动脚本中设置的用户名和密码并非mysqlmaster所授权的用户
登录mysql真实提供功能的服务器
mysql -ujack -p123456 -h mysql-proxy-ip --port 3306
然后在master上使用tcpdump抓包分析
tcpdump -i eth0 -nn -XX ip dst mysql-master-ip andtcp dst port 3306
在从服务器上也使用tcpdump抓包分析
tcpdump -i eth0 -nn -XX ip dst mysql-slave-ip andtcp dst port 3306
mysql -ujack -p123456 -h mysql-proxy-ip --port3306
create database db_name可以看到数据在master上抓包了
select * from up01;可以看到数据在slave上抓包了
如果没有实现,请多开几个mysql-proxy的连接会话
并多执行几次select语句
可以在mysql-proxy的管理端上使用
select * from backends去查看后端相应信息
+-------------+----------------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+----------------------+-------+------+------+-------------------+
| 1 |192.168.125.128:3306 | up | rw | NULL | 0 |
| 2 |192.168.125.129:3306 | up | ro | NULL | 0 |
+-------------+----------------------+-------+------+------+-------------------+
为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器192.168.10.131,通过命令行登录管理MySQL服务器/opt/mysql/bin/mysql -uroot -p'new-password'
关闭Slave同步进程
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
连接MySQL-Proxy
/opt/mysql/bin/mysql -uproxy1 -p'password' -P4040 -h192.168.10.132
登陆成功后,在first_db数据的first_tb表中插入两条记录
mysql> use first_db;
Database changed
mysql> insert into first_tb values (007,’first’);
Query Ok, 1 row affected (0.00 sec)
mysql> insert into first_tb values (110,’second’);
Query Ok, 1 row affected (0.00 sec)
查询记录
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
通过读操作并没有看到新记录
mysql> quit
退出MySQL-Proxy