mysql集群架构方式很多,根据不同的需求做不一样的架构,简单一点的就是mysql的replication,也就是Mysql的复制功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多个分层,那么现在我所要说的是master-slaves的模式(其他的模式原理基本都一样),然后再通过mysql官方提供的Mysql-proxy实现读写分离,达到的效果。
环境:
主机::192.168.1.109,slave1:192.168.1.110,Proxy:192.168.1.112。(workstation10平台创建虚拟机模拟)
操作系统:Red Hat Enterprise Linux Server release 5.8
mysql:mysql-5.5.37-linux2.6-i686.tar.gz
mysql-proxy:mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz
1、安装mysql:
[[email protected] ~]# cd /usr/local //进入到安装目录
[[email protected] local]# tar -zxvf mysql-5.5.37-linux2.6-i686.tar.gz //解压mysql二进制包
[[email protected] local]# ln -s mysql-5.5.37-linux2.6-i686 mysql //解压之后加上链接
[[email protected] local]# groupadd mysql //增加mysql用户组
[[email protected] local]# useradd -g mysql mysql //增加mysql用户帐号
[[email protected] local]# cd mysql //进入安装之后的mysql目录
[[email protected] mysql]# chown -R root:mysql . //修改文件属组和属主,注意该命令后面有一个点,表示当前目录
[[email protected] mysql]# chown -R mysql:mysql data/ //把data目录的属主改为mysql
[[email protected] mysql]# cp support-files/my-large.cnf /etc/my.cnf //拷贝mysql配置文件放在etc目录下并改名为my.cnf
[[email protected] mysql]# cp support-files/mysql.server /etc/init.d/mysqld //拷贝mysql的启动脚本放在/etc/init.d/目录下
[[email protected] mysql]# service mysqld start //启动mysql
至此mysql安装已经结束,接下来就是mysql的主从配置。(其他两台主机也照此安装mysql)
2、配置:
[[email protected] mysql]# vi //my.cnf //编辑配置文件
-id=1 //默认是1,不是的话则改为1
thread_concurrency = 2 //线程并发数(CPU*2)
log-bin=mysql-bin //打开二进制日志功能
保存退出,重新启动mysql。
登入mysql:
[[email protected] mysql]# mysql -uroot -p //默认密码空,直接敲回车进入
mysql> grant replication slave on *.* to [email protected]‘192.168.1.%‘ identified by ‘123456‘;
mysql>flush privileges;
mysql>show grants for ‘repl‘@‘192.168.1.%‘; //查看授权,有记录说明ok
mysql>show master status\G; //查看master服务器状态,有二进制日志文件名和记录位置(position)
至此mysql配置完成。
3、配置slave
[[email protected] mysql]#vi //my.cnf //编辑配置文件
-id=11 //设置与不一样就行,
thread_concurrency = 2 //线程并发数(CPU*2)
relay-log=mysql-log //打开中继日志
relay-log-index=mysql-log.index //设置relay-log-index文件名
保存退出,重新启动mysql。
登入mysql:
[[email protected] mysql]# mysql -uroot -p //默认密码空,直接敲回车进入
mysql>change master to
->master_host=‘192.168.1.109‘, //master服务器ip
->mastet_user=‘repl‘, //用户名
->mastet_password=‘123456‘, //密码
->master_log_file=‘mysql-bin.000001‘, //master服务器二进制日志名
->master_log_pos=107;
>slave start; //启动slave
mysql> SHOW SLAVE STATUS\G; //查看slave状态
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.109
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running: yes
...omitted...
Seconds_Behind_Master: NULL
如果 Slave_IO_Running和Slave_SQL_Running显示为yes则配置ok,过程中可能会出现:
Slave I/O: error connecting to master ‘[email protected]:3306‘ - retry-time: 60 retries: 86400, Error_code: 2003
引起问题原因是防火墙拦截了,解决办法就是修改防火墙配置,简单直接的办法就是把master服务器的防火墙关掉,执行//init.d/iptables stop命令。
接下来测试,在中创建一个db_test,查看slave中是是否存在db_test。
至此slave配置结束,其他从按此方式配置。
4、配置mysql-proxy,最好另外部署一台机器,尤其是上线运行后,所以这里测试也是用了单独一台虚拟机,没有部署在或slave机器上。
[[email protected] local]# tar -zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz //解压
[[email protected] local]# ln -s mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit mysql-proxy //加一个快捷链接
[[email protected] local]# groupadd mysql-proxy //创建用户组
[[email protected] local]# useradd -g mysql-proxy mysql-proxy //创建用户
[[email protected] local]# cd mysql-proxy //进入mysql-proxy目录
[[email protected] mysql-proxy]# chown -R root:mysql-proxy . //更改目录属主和属组,命令后面有一个点(.)表示当前目录
[[email protected] mysql-proxy]# vi /etc/profile.d/mysql-proxy.sh //把mysql的bin目录加到PATH变量中,
export
PATH=$PATH:
/usr/local/-/bin
[[email protected] mysql-proxy]# source //profile //让配置文件立刻生效
[[email protected] mysql-proxy]# mysql-proxy --help-all //查看mysql-proxy命令,出现如下信息:
下面我们启动mysql-proxy,做一个简单测试,不过我们先要简单介绍一下mysql-proxy命令。
mysql-proxy 命令
- --help-all ———— 用于获取全部帮助信息
- ---address=host:port ———— 监听的地址和端口
- --admin-address=host:port ———— 管理模块监听的地址和端口
- --proxy-backend-addresses=host:port ———— 后端mysql服务器的地址和端口(主服务器)
- --proxy-read-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口(从)
- --proxy-lua-script=file ———— 完成mysql代理功能的Lua脚本
- --daemon ———— 以守护进程模式启动mysql-proxy
- --defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径
- --log-file=/path/to/log_file_name ———— 日志文件名称
- --log-level=level ———— 日志级别
- --log-use-syslog ———— 基于syslog记录日志
- --user=user_name ———— 运行-进程的用户
[[email protected] mysql-proxy]# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.109:3306" --proxy-read-only-backend-addresses="192.168.1.110:3306" //启动mysql-proxy
[[email protected] mysql-]# tail /var/log/mysql-proxy.log //查看启动日志
2014-05-10 00:09:22: (critical) plugin proxy 0.8.4 started
2014-05-10 00:09:22: (debug) max open file-descriptors = 1024
2014-05-10 00:09:22: (message) proxy listening on port :4040
2014-05-10 00:09:22: (message) added read/write backend: 192.168.1.109:3306
2014-05-10 00:09:22: (message) added read-only backend: 192.168.1.110:3306
[[email protected] mysql-proxy]#netstat -ntulp | grep :4040 //查看监听的端口
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 10056/mysql-
现在我们需要在服务器中创建一个远程登入的账号
master:
mysql> GRANT ALL ON *.* TO [email protected]
‘192.168.1.%‘
IDENTIFIED BY
‘123456‘
;
Query OK, 0 rows affected (0.07 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.04 sec)
在从上做测试:
slave:
[[email protected] ~]
# -uroot -p123456 -h192.168.1.112 --port=4040
这样就连上了Mysql-Proxy服务器了,如果出现错误:ERROR 2003 (HY000): Can‘t connect to MySQL on ‘192.168.1.112‘ (113),请修改防火墙配置或关闭。
下面我们来实现读写分离,Mysql-Proxy本身不会实现读写分离,主要是依靠 Lua 脚本实现的。
[[email protected] mysql-proxy]# killall mysql-proxy //杀掉mysql-proxy进程
[[email protected] mysql-proxy]# netstat -ntlup | grep 4040 //查看进程是否停掉
[[email protected] mysql-proxy]# cd share/doc/mysql-proxy/
[[email protected] mysql-proxy]# ls | grep rw-splitting.lua //查看读写分离脚本,lua语言实现
rw-splitting.lua
[[email protected] mysql-proxy]# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.109:3306" --proxy-read-only-backend-addresses="192.168.1.110:3306" --proxy-lua-script="/usr/local/-proxy/share/doc/mysql-/rw-splitting.lua"
[[email protected] mysql-proxy]#
在slave 上做测试,ok,完成了,mysql-实现mysql集群的读写分离完成了,这种模式是MySQL集群最为基本的一种模式,也能够实现,后续研究MySQL更深层次的集群,一同分享一同进步。^_^