mysql 负载均衡 主备分离

此项目需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;

slave

mysql> 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 start

        netstat -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






猜你喜欢

转载自blog.csdn.net/yizhixiaocaiji26/article/details/79452813