本页主题: mysql 主从复制读写分离实现 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

截命
网络无可替代,漏洞无处不在。
勤奋版主奖 优秀会员奖 网络高手奖 优秀斑竹奖
级别: 论坛版主


论坛精华: 11
疯狂发帖: 610
学盟威望: 406 点
学盟金币: 7570 金
学盟贡献: 39 点
学盟好评: 130 分
学盟神石: 0 块
在线时间:161(小时)
签名状态: 已签到-[85次/39天]
注册时间:2008-03-08
最后登录:2008-08-29

 mysql 主从复制读写分离实现

0
mysql主从复制 0i>>CvAl}  
(一)安装mysql(主从服务器皆相同) 先创建用户 useradd mysql -s /sbin/nologin Gm[XnUR7V  
P]0/S  
tar zxvf mysql-5.0.45.tar.gz #2dH2k\F  
cd mysql-5.0.45 6Zx)L|B  
./configure --prefix=/usr/local/mysql  --localstatedir=/opt/data --with-extra-charsets=utf8,gb2312,gbk --with-pthread --enable-thread-safe-client sdBB(  
注:配置过程指定数据文件的位置及另加的字符集. f&I5bPS7}  
make 629ogJo8  
make install "XLFw;o  
cp support-files/my-large.cnf   /etc/my.cnf 1nR\ m+{  
cd /usr/local/mysql v+~O\v5Q  
chgrp -R mysql . E/2_@&U:}  
生成基本的数据库和表:  /usr/local/mysql/bin/mysql_install_db --user=mysql AEd9H +I  
成功执行后察看数据目录/opt/data,看是否有文件或目录生成. EGzlRSgO  
chown -R mysql:mysql /opt/data >J_(~{-sNG  
记得给每个数据库设置root密码. t{e}3}LEd  
(二)修改配置文件 ))6YOc  
不同的地方就是server-id,主服务器配置文件不用修改,从服务器的配置文件server-id=10.其他的内容基本相同. U U3o (Yq  
(三)启动服务 U^kk0OT^  
/usr/local/mysql/bin/mysqld_safe --user=mysql& O f]/tdPp  
这个过程主辅服务器都相同. +o]J0Gu  
(四)授权(在主服务器上进行) q}C;~nMD  
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.8.100 identified by 'mylqs'; ^fP5@T*f  
(五)查询主数据库状态(主服务器上进行) $XcuU sG  
mysql> show master status; }[y_Fr0  
+------------------+----------+--------------+------------------+ jxZ_-1  
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 2L S91  
+------------------+----------+--------------+------------------+ 2BO"mc<#$  
| mysql-bin.000003 |      235 |              |                  | s0'6r$xj  
+------------------+----------+--------------+------------------+ SmV}Wf  
记下file及position的值,后面做从服务器操作的时候需要用. xu@+b~C\  
(六)配置从服务器 X.AE>fx*h  
mysql> change master to master_host='192.168.8.101', master_user='rep1', master_password='mysql', master_log_file='mysql-bin.000003', master_log_pos=235; \^dYmU  
正确执行后再执行: T3t w.yh  
mysql> start slave; "Mh}n-oju  
就启用了复制功能.这里我们运行一下 mysql> show slave status\G 来检查一下,一个正常的输出结果应该如下面的形式: !T.yv5ge'  
mysql> show slave status\G V]/ $ dJ  
*************************** 1. row *************************** R#Z m[S  
             Slave_IO_State: Waiting for master to send event vb$i00?  
                Master_Host: 192.168.8.101 A",R2d  
                Master_User: rep1 ,D'bIk  
                Master_Port: 3306 AbB+<0  
              Connect_Retry: 60 G%T<wKD<  
            Master_Log_File: mysql-bin.000003 [@0Hmd7  
        Read_Master_Log_Pos: 235 rfOrh^  
             Relay_Log_File: -relay-bin.000009 {<Xl57w-Q  
              Relay_Log_Pos: 235 Q7_#k66gb7  
      Relay_Master_Log_File: mysql-bin.000003 ;W3c|5CE  
           Slave_IO_Running: Yes alyA#zao|  
          Slave_SQL_Running: Yes /p)y!5e  
            Replicate_Do_DB: VVc-Dx  
        Replicate_Ignore_DB: T5aeO^x  
         Replicate_Do_Table: l>pnY%(A  
     Replicate_Ignore_Table: p%5(Qqmlk  
    Replicate_Wild_Do_Table: WB"90!  
Replicate_Wild_Ignore_Table: qR^+K@ *|  
                 Last_Errno: 0 W1[C/dDc  
                 Last_Error: @XH@i+ {B  
               Skip_Counter: 0 Olr'n% }  
        Exec_Master_Log_Pos: 235 Cil1wFBb  
            Relay_Log_Space: 235 Zrq\:KxX  
            Until_Condition: None |q 0iX2W  
             Until_Log_File: }5y ]kn  
              Until_Log_Pos: 0 cFoeyI#v  
         Master_SSL_Allowed: No ;z9U_  
         Master_SSL_CA_File: p:Zhg{sF  
         Master_SSL_CA_Path: !8o;~PPVl  
            Master_SSL_Cert: qhNYQ/uS  
          Master_SSL_Cipher: m"vWu0/#  
             Master_SSL_Key: j8?rMD~  
      Seconds_Behind_Master: 0 Edl .R}&1  
1 row in set (0.00 sec) t,qz%J&a  
0|~3\e/QV  
请注意:slave_IO进程及slave_SQL进程都必须正常运行,在状态输出重表现为:   Slave_IO_Running: Yes  及Slave_SQL_Running: Yes 否则都是不正确的状态(如一个值Yes,另外一个是NO则不行). C oO0~q  
(七)主数据库有数据的情况: <s5s<q2  
1、数据库锁表操作,不让数据再进行写入动作。mysql> FLUSH TABLES WITH READ LOCK; KOD%>+vG$  
2、察看主数据库的状态 mysql> show master status; 照第(五)步记录输出值。 qZX\riR  
3、把主服务器数据文件复制到从服务器,最好先用tar处理一下。 ./}W3  
4、取消主数据库锁定 mysql> UNLOCK TABLES; ASaNac-3  
5、从服务器的操作。跟前面的步骤一样(略过) <*DP G\6Ma  
       e`Tssa+  
mysql代理安装配置 \>  
p}h9>R  
一、安装mysql-proxy.需要按下列顺序安装其所依赖的包: (?~*.g!  
(一)安装LUA *@[+C~U  
tar zxvf lua-5.1.tar.gz SgY\h{{sP  
cd lua-5.1 2R`}}4<Z  
用vi修改Makefile,使"INSTALL_TOP=/usr/local/lua",这样做的目的是为了是lua的所有文件都安装在目录/usr/local/lua/ t`vIcCXqyl  
make posix &BQ%df<y\  
make install [^A>hs*  
|%5nV=&\  
(二)安装 libevent -LEpT$v|  
tar zxvf libevent-1.1a.tar.gz - x]gp5  
cd libevent-1.1a S$Fq1  
./configure --prefix=/usr/local/libevent pn4~?Aua0/  
make g+M& _n  
make install K!_''Fg  
t+Hx&_pMj  
(三)安装check ^ l9NF  
tar zxvf check-0.8.4.tar.gz y`.m'n7>P  
cd check-0.8.4 {]dH+J7  
./configure vP{;'R  
make 1PjqXgN5p  
make install '7TT4~F  
3eP7vy  
(四)设置安装mysql-proxy所需的环境变量.把下面的内容追加到/etc/profile中 wQ/Z:  
export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm" F otHITw[  
export CPPFLAGS="-I/usr/local/libevent/include" :T #"bY  
export CFLAGS="-I/usr/local/libevent/include" Jsp>v'Qvq  
然后执行 source /etc/profile (安装完mysql-proxy不再需要这些变量,可以删除之) [*AWCV  
Wg ?P"  
(五)安装mysql(只安装mysql客户端即可) B!zqvShF  
tar zxvf  mysql-5.0.45.tar.gz yCG<qQz  
cd mysql-5.0.45 |=W=H6h*  
./configure --prefix=/usr/local/mysql  --without-server J=C63YB  
make aj)?P  
make install ,%%}d9  
=j{r95)|u  
(六)安装mysql-proxy c/\$AJV.H  
tar zxvf mysql-proxy-0.5.0.tar.gz u  t4+c0  
cd mysql-proxy-0.5.0 ZT'Sw%U:  
./configure –prefix=/usr/local/mysql-proxy  --with-mysql=/usr/local/mysql  --with-lua Qo;#}%}^^  
Make J \V.J/  
Make install Ud8*yB  
~1yMw.04V  
二、主要的命令行选项 11Hf)]M   
--help-all显示所有的帮助选项 {k}EWV  
--admin-address=host:port 管理主机及端口,默认是4041 Y4B< ]C4  
--proxy-address=host:port 代理服务器的监听地址及端口,默认4040 XN=Cq*3}  
--proxy-read-only-address=host:port 只读连接时,代理服务器的监听地址及端口。默认4042 * (4TasQu  
--proxy-backend-addresses=host:port连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。 Iu -CXc  
--proxy-lua-script=file 指定lua脚本的名称 GK/Q]}Q8pZ  
3oCw(Ff  
三、 使用方法 ;5.o;|w?!  
2个mysql服务器的情形 n6a*|rE  
mysql-proxy \ dWI.t1`i  
     --proxy-backend-addresses=mysql_ip1:3306 \ yeCR{{B/'  
     --proxy-backend-addresses=mysql_ip2:3306 cc%O35o  
4#qjRmt  
3个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询。 Bn"r;pqWiT  
mysql-proxy --proxy-backend-addresses=<master_ip> :3306\ a#0G mK  
         --proxy-read-only-address=<slave_ip1>:3306 \ &E{5k{Y  
         --proxy-read-only-address=<slave_ip2>:3306 PSdH9ea  
O^ ]I>A#d  
/ -=(51}E  
四、mysql-proxy启动 : {9|/a  
编写脚本/usr/local/bin/mysql-proxy.sh其内容如下: K;f'&9-+i,  
#!/bin/bash G5Ci"0  
LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/?.lua" mysql-proxy --proxy-read-only-backend-addresses=192.168.1.38:3306 --proxy- eh'mSf^=p  
backend-addresses=192.168.1.33:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log & a{h(BI^~  
chmod 755 /usr/local/bin/mysql-proxy.sh; 执行命令/usr/local/bin/mysql-proxy.sh启动服务 K]bS:[34 R  
B-[SUmHr  
$/C<^}A  
配置验证 #{0DpSzE5  
1、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。 Snt=Hil`  
mysql> create database first_db; u,F d[[t  
Query OK, 1 row affected (0.01 sec) }bznx[4?I  
在主数据库服务器创建库first_db FbM5Bqv  
]@J}f}Mjo  
mysql> create table first_tb(id int(3),name char(10)); fnnwe2aso  
Query OK, 0 rows affected (0.00 sec) +$>ut r  
在主数据库服务器创建表first_db QBsDO].J<  
`^J~^Z7Y-  
mysql> insert into first_tb values (001,'myself'); &`L5UX  
Query OK, 1 row affected (0.00 sec) vB4cdW 2#3  
在主数据服务器的表first_db中插入记录 Ql*/{#$  
mF F]d  
现在转到从数据库服务器,看是否同步了上面主数据库的数据 N~>?w#?J  
mysql> show databases; c0G/irK  
+--------------------+ sf*SxdoZU  
| Database           | LVEVCpp@  
+--------------------+ .hJ8K #r  
| information_schema | 8e\v5K9  
| first_db           | $m=z87hX  
| mysql              | <dYk|5AdLF  
| test               | j=AJs<  
+--------------------+ |%V.Lae  
4 rows in set (0.01 sec) >rFvT>@NU  
数据库自动生成了 n#&RY%#`  
?@#}%<yEq  
mysql> use first_db; &"kx (B  
Database changed ,){0y%c#y  
mysql> show tables; aXJe"IT.u  
+--------------------+ UA8!?r-cR  
| Tables_in_first_db | !xc7~D@om(  
+--------------------+ *=7[Ip< X  
| first_tb           | "QF083$  
+--------------------+ @ubz?5  
1 row in set (0.00 sec) []]3"n  
表也自动生成了 E nvs[YZe  
_)l %-*Z7p  
mysql> select * from first_tb; r9Z/y*q  
+------+--------+ $a A.d^  
| id   | name   | tAA7  
+------+--------+ EDo@J2A  
|    1 | myself | x]ti3?w  
+------+--------+ ]1&9~TL  
1 row in set (0.00 sec) #I?iR 3u  
记录也按照我们的意愿存在了 [tzSr=,Cg  
gxOmbQt@;  
2、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。 JC"K{ V{  
顶端 Posted: 2008-08-26 21:10 | [楼 主]
帖子浏览记录 版块浏览记录
学盟技术交流中心 » 技术文章

Total 0.021711(s) query 5, Time now is:08-29 13:17, Gzip enabled 黑ICP备05002849号
Powered by PHPWind v6.3.2 Certificate Code © 2003-07 PHPWind.com Corporation