Mysql主从同步及其读写分离的实现过程
环境:CentOS release 5.2 、mysql-5.1.55.tar.gz、mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
测试机:172.16.10.11:mysql proxy 及其mysql主数据库
        172.16.10.12:mysql从数据库
1.编译安装mysql:
a首先yum安装mysql所需要的环境
#yum install  make  gcc gcc-c++  libxml2   libxml2-devel  libmcrypt   libmcrypt-devel   libtool-ltdl   apr   apr-*   ncurses  ncurses-*
b.安装mysql
#/usr/sbin/groupadd mysql
#/usr/sbin/useradd mysql –g mysql
在执行./configure 之前,先执行:
# autoreconf --force --install
# libtoolize --automake --force
# automake --force --add-missing
#./configure --prefix=/opt/mysql --localstatedir=/opt/mysql/data/ --with-server-suffix=-enterprise-gpl --without-debug --with-big-tables --with-extra-charsets=all --with-pthread --enable-thread-safe-client --enable-static --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-ndb-debug --with-plugins=innobase
#Make
#Make install
初始化
#scripts/mysql_install_db –-user=mysql (一定要添加)
改权限、主配置文件、环境变量
#chown -R mysql.mysql /opt/mysql/
# cp support-files/my-medium.cnf /etc/my.cnf 
# chmod 750 /opt/mysql –R   //-R : 对目前目录下的所有档案与子目录进行相同的权限变更
# chgrp mysql /opt/mysql -R
启动mysql
#/opt/mysql/bin/mysqld_safe –user=mysql &
到此mysql服务器的安装就结束了!
备:在两台服务器上均安装mysql数据库
2 mysql主从同步配置过程
在主服务器上:
#vi /etc/my.cnf
修改或添加以下条目
 Log-bin=master-bin     //修改
 Log-bin-index=master-bin.index //添加
 Server-id=1
重启mysql数据库
添加replication账号
#/opt/mysql/bin/mysql –uroot –p
Mysql>grant replication slave on *.* to ‘slave’@’172.16.10.12’ identified by ‘123456’;
Mysql>flush privileges;
查看master当前的日志文件及日志位置:
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      106 |              |                  |
+-------------------+----------+--------------+------------------+
在从的数据库上:
#vi /etc/my.cnf
修改或添加以下条目
log-bin=mysql-bin
relay-log=relay-log-bin   //添加
relay-log-index=slave-relay-bin.index //添加
server-id=2
注:server-id不能与主服务器的相同
重启mysql服务
#/opt/mysql/bin/mysql –uroot –p
Mysql>stop slave;
Mysql>change master to master_host=’172.16.10.11’,master_port=3306,master_user=’slave’,master_password=’123456’,master_log_file=’master-bin.000001’,master_log_pos=106;
Mysql>start slave
Mysql>show slave status\G
出现如下两行 
Slave_IO_Running: Yes          
Slave_SQL_Running: Yes
表示主从mysql服务器配置完成!  
如果出现no,就将从数据库上述重新操作一遍"stop slave"。
Mysql proxy配置过程:
一、必备软件:
1、LUA
   可以去LUA的官方下载:www.lua.org
2、MySQL Proxy
   这里有好多二进制版本。
    http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/
   或者去MYSQL官方下载源代码。
三、安装体验
1、 LUA的安装
[root@localhost ~]#tar zxvf lua-5.1.2.tar.gz -C /usr/local
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mv lua-5.1 lua
[root@localhost lua]# cd lua
[root@localhost lua]#make local;make install;
    导出环境变量:
[root@localhostlua]#export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"
2、MySQL Proxy 安装  
[root@localhost ~]#tar -zxvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz -C /usr/local/mysql/
[root@localhost ~]#cd /usr/local/mysql
[root@localhost mysql]#mv mysql-proxy-0.6.1-linux-rhel4-x86-32bit/ mysql-proxy
[root@localhost sbin]# export PATH=$PATH:/usr/local/mysql/mysql-proxy/sbin/
四、使用MySQL Proxy
mysql proxy就是一个中间层代理,也可以说是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载均衡,对用户来说,mysql proxy完全透明,应用则只需连接到mysql proxy的监听端口即可。
1、查看帮助选项
[root@localhost ~]#、启动MySQL-Proxy(测试读写分离) mysql-proxy --help-all
3
[root@localhost ~]# cd /opt/mysql-proxy/bin
[root@localhost ~]#./mysql-proxy --admin-username=admin --admin-password=admin --proxy-read-only-backend-addresses=172.16.10.12:3306 --proxy-backend-addresses=127.0.0.1:3306 --proxy-lua-script=/usr/local/mysql/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --admin-lua-script=/usr/local/mysql/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --max-open-files=1500
备注:
--daemon 采用daemon方式启动
--admin-address=:4401 指定mysql proxy的管理端口,在这里,表示本机的4401端口
--proxy-address=:4040 指定mysql proxy的监听端口,也可以用 127.0.0.1:4040表示
--proxy-backend-addresses=127.0.0.1:3306 指定mysql主机的端口
--proxy-read-only-backend-addresses=172.16.10.12:3306 指定另一个只读的mysql主机端口
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离
问题:网站在使用mysql proxy连接数据库时网站出现乱码 (不使用时正常)
网友分析:连接上mysql proxy后,执行查询时,随即出现乱码,出现此问题的原因是当我们使用mysql proxy读写分离时,通常会有多个后端服务器,客户端发出查询请求时,一般会先发出一条类似于“SET NAME utf8”的语句来声明客户端编码,然后再发出实际查询的SQL语句 ,但mysql proxy可能会把两条语句分发给不同的后端数据库,于是就出现了乱码。
解决方法:
强制指定后端服务器的字符编码:
[mysqld]
init-connect='SET NAME utf8'
default-character-set=utf8
skip-character-set-client-handshake
重启mysql服务
然后用phpmyadmin测试,就可以正常使用了!(phpmyadmin使用的是utf8编码)
 

Mysql主从同步及其读写分离的实现过程_数据库