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

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


论坛精华: 11
疯狂发帖: 926
学盟威望: 964 点
学盟金币: 9272 金
学盟贡献: 139 点
学盟好评: 129 分
学盟神石: 0 块
在线时间:304(小时)
签名状态: 未签到-[243次/118天]
注册时间:2008-03-08
最后登录:2008-11-20

 mysql 主从复制读写分离实现

0
mysql主从复制 CJ;D&qo  
(一)安装mysql(主从服务器皆相同) 先创建用户 useradd mysql -s /sbin/nologin o`jVd,aj  
n\scOM)3  
tar zxvf mysql-5.0.45.tar.gz k8sjW!2  
cd mysql-5.0.45 P_c9v/  
./configure --prefix=/usr/local/mysql  --localstatedir=/opt/data --with-extra-charsets=utf8,gb2312,gbk --with-pthread --enable-thread-safe-client *p%=u>?&  
注:配置过程指定数据文件的位置及另加的字符集. u"1Zv!  
make v|u[BmA)*k  
make install 3rw<#t;v  
cp support-files/my-large.cnf   /etc/my.cnf aqzIMOAf  
cd /usr/local/mysql &`IC 3O5  
chgrp -R mysql . 9d_ Zdc  
生成基本的数据库和表:  /usr/local/mysql/bin/mysql_install_db --user=mysql -\V!f6Q  
成功执行后察看数据目录/opt/data,看是否有文件或目录生成. >`(]&o6<$  
chown -R mysql:mysql /opt/data yT<,0~F9  
记得给每个数据库设置root密码. 64R~ $km  
(二)修改配置文件 *P0sl( &  
不同的地方就是server-id,主服务器配置文件不用修改,从服务器的配置文件server-id=10.其他的内容基本相同. ]7DS>%m Y(  
(三)启动服务 }>$3B5}  
/usr/local/mysql/bin/mysqld_safe --user=mysql& ly( LMr  
这个过程主辅服务器都相同. Wi<g  
(四)授权(在主服务器上进行) ,%d?gi"&  
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.8.100 identified by 'mylqs'; "Ta"5XW  
(五)查询主数据库状态(主服务器上进行) $SfYO!n7Q  
mysql> show master status; w=kW~gg  
+------------------+----------+--------------+------------------+ h@jk3J9^  
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | z 8<"  
+------------------+----------+--------------+------------------+ 1s-=zs  
| mysql-bin.000003 |      235 |              |                  | ?0?+~0sI  
+------------------+----------+--------------+------------------+ C ett*jm_  
记下file及position的值,后面做从服务器操作的时候需要用. zU";\);  
(六)配置从服务器 |`O210B@  
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; PDb7h  
正确执行后再执行: \N.Bx  
mysql> start slave; d+]/0J!c  
就启用了复制功能.这里我们运行一下 mysql> show slave status\G 来检查一下,一个正常的输出结果应该如下面的形式: gZ6tb p,X  
mysql> show slave status\G trlZ  
*************************** 1. row *************************** D3x W?$Z  
             Slave_IO_State: Waiting for master to send event #<yKG\X?  
                Master_Host: 192.168.8.101 zX&wfE8T  
                Master_User: rep1 DaqpveKa  
                Master_Port: 3306 V)cL=4G  
              Connect_Retry: 60 ,5P tB]8&3  
            Master_Log_File: mysql-bin.000003 ^MUvd  
        Read_Master_Log_Pos: 235 swG!O}29OX  
             Relay_Log_File: -relay-bin.000009 nx@ h  
              Relay_Log_Pos: 235 -*~~ 00w  
      Relay_Master_Log_File: mysql-bin.000003 Q7XlFjzcm  
           Slave_IO_Running: Yes .|<+-Rsj  
          Slave_SQL_Running: Yes 6tv-PgZ  
            Replicate_Do_DB: ;eT+Ly|{  
        Replicate_Ignore_DB: OGAC[s~V  
         Replicate_Do_Table: vz3#.a~2  
     Replicate_Ignore_Table: $c}-/U 8  
    Replicate_Wild_Do_Table: J/B`c(  
Replicate_Wild_Ignore_Table: =Hx]K8N)  
                 Last_Errno: 0 y3OF+;E  
                 Last_Error: zD;k|"e  
               Skip_Counter: 0 oL@K{dk  
        Exec_Master_Log_Pos: 235 0+e  
            Relay_Log_Space: 235 aa" 3 Io  
            Until_Condition: None Ft38)T"2R\  
             Until_Log_File: "$pbK:  
              Until_Log_Pos: 0 AUu<@4R7  
         Master_SSL_Allowed: No 6 Ia HaV+P  
         Master_SSL_CA_File: TY'c'u,  
         Master_SSL_CA_Path: 57EX#:a  
            Master_SSL_Cert: iiQ q112`  
          Master_SSL_Cipher: nH&z4-1Y?  
             Master_SSL_Key: # :k=  
      Seconds_Behind_Master: 0 #p@GhI!6  
1 row in set (0.00 sec) m..ajYSQ  
kEnGr6e  
请注意:slave_IO进程及slave_SQL进程都必须正常运行,在状态输出重表现为:   Slave_IO_Running: Yes  及Slave_SQL_Running: Yes 否则都是不正确的状态(如一个值Yes,另外一个是NO则不行). ?h&XIM(  
(七)主数据库有数据的情况: Pl/ dUt_  
1、数据库锁表操作,不让数据再进行写入动作。mysql> FLUSH TABLES WITH READ LOCK; >n09K8 A  
2、察看主数据库的状态 mysql> show master status; 照第(五)步记录输出值。 %42a>piev  
3、把主服务器数据文件复制到从服务器,最好先用tar处理一下。 (lM,'  
4、取消主数据库锁定 mysql> UNLOCK TABLES; QXZXj#`  
5、从服务器的操作。跟前面的步骤一样(略过) !XtG6ON=  
       Nnh\FaI  
mysql代理安装配置 ?sk>Mzr  
&gp&i?%X9b  
一、安装mysql-proxy.需要按下列顺序安装其所依赖的包: \\k=N(n  
(一)安装LUA "-=fi 'D  
tar zxvf lua-5.1.tar.gz ]CzK{-W  
cd lua-5.1  tKV,  
用vi修改Makefile,使"INSTALL_TOP=/usr/local/lua",这样做的目的是为了是lua的所有文件都安装在目录/usr/local/lua/ 3Q$ 4`p;  
make posix D3 C7f'  
make install 7su2A>Ix  
)7 Mss/2T  
(二)安装 libevent ;8^k=8  
tar zxvf libevent-1.1a.tar.gz Q#3}AO  
cd libevent-1.1a 5a/A?9?,  
./configure --prefix=/usr/local/libevent u9 &$`N_G  
make )IcSdS0@M  
make install <\epj=OclV  
$\ZWQct  
(三)安装check .T7CMkYt  
tar zxvf check-0.8.4.tar.gz ZY8.p  
cd check-0.8.4 YD[AgToo0  
./configure FbuWFC  
make GXm#\)  
make install ]v}W9{sY  
?i_/f}.K  
(四)设置安装mysql-proxy所需的环境变量.把下面的内容追加到/etc/profile中 B&B4 P  
export LUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib -llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm" k@%5P-e}  
export CPPFLAGS="-I/usr/local/libevent/include" Ff>X='{  
export CFLAGS="-I/usr/local/libevent/include" }8l+Jd3"  
然后执行 source /etc/profile (安装完mysql-proxy不再需要这些变量,可以删除之) X`&Us  
gjK: a@{  
(五)安装mysql(只安装mysql客户端即可) #0*I|gfV  
tar zxvf  mysql-5.0.45.tar.gz T3)m{gv0`  
cd mysql-5.0.45 Ax!@vL&@  
./configure --prefix=/usr/local/mysql  --without-server \gZjq]3  
make 7 Uu  
make install l]e7  
Uefw  
(六)安装mysql-proxy .hXdXY  
tar zxvf mysql-proxy-0.5.0.tar.gz E :Y *;  
cd mysql-proxy-0.5.0 FLekyJmw~  
./configure –prefix=/usr/local/mysql-proxy  --with-mysql=/usr/local/mysql  --with-lua Z*|qbu)  
Make xCV3HnZ  
Make install Q[y75 [  
SA|f1R2uS  
二、主要的命令行选项 J+LFzl07q  
--help-all显示所有的帮助选项 %u43Pj  
--admin-address=host:port 管理主机及端口,默认是4041 -rlxxLT+  
--proxy-address=host:port 代理服务器的监听地址及端口,默认4040 ^&DHBx"J  
--proxy-read-only-address=host:port 只读连接时,代理服务器的监听地址及端口。默认4042 #=b_!~:%  
--proxy-backend-addresses=host:port连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。 5}~*,_J2Z  
--proxy-lua-script=file 指定lua脚本的名称 rc*&K#? B  
2#*Bw=  
三、 使用方法 ;#3!ZB:}  
2个mysql服务器的情形 /I$g.f/#  
mysql-proxy \ 9:fVHynr  
     --proxy-backend-addresses=mysql_ip1:3306 \ ;'}1   
     --proxy-backend-addresses=mysql_ip2:3306 7,j}]  
i?qS8h{  
3个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询。 +7^%fX;3pW  
mysql-proxy --proxy-backend-addresses=<master_ip> :3306\ +QtK "5M  
         --proxy-read-only-address=<slave_ip1>:3306 \ TW{.qed8^  
         --proxy-read-only-address=<slave_ip2>:3306 }_@*,  
DJS0;!# |O  
K``MS  
四、mysql-proxy启动 M56^p ,  
编写脚本/usr/local/bin/mysql-proxy.sh其内容如下: W-qec  
#!/bin/bash Iojyku\W.  
LUA_PATH="/usr/local/mysql-proxy/share/mysql-proxy/?.lua" mysql-proxy --proxy-read-only-backend-addresses=192.168.1.38:3306 --proxy- 9utiev~3  
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 & 5\gL+ qM0  
chmod 755 /usr/local/bin/mysql-proxy.sh; 执行命令/usr/local/bin/mysql-proxy.sh启动服务 \UA\0p  
 ,5!&}  
a%| I'r  
配置验证 g)0>J  
1、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。 Dz d[<Qln  
mysql> create database first_db; ga?:k,xv  
Query OK, 1 row affected (0.01 sec) PP*6nW8  
在主数据库服务器创建库first_db 7eNLs  
Cn"_x  
mysql> create table first_tb(id int(3),name char(10)); ol0i^d*9F  
Query OK, 0 rows affected (0.00 sec) [psZc'q  
在主数据库服务器创建表first_db 9 NGKh3V  
"MvSF1  
mysql> insert into first_tb values (001,'myself'); \0W0o5c$  
Query OK, 1 row affected (0.00 sec) 1COSbi]  
在主数据服务器的表first_db中插入记录 .kU}x3m  
)7{r8a  
现在转到从数据库服务器,看是否同步了上面主数据库的数据 mrq,kwM  
mysql> show databases; =k*XGbU  
+--------------------+ $bD`B'5  
| Database           | ,a?oGi  
+--------------------+ 2y \ogF  
| information_schema | $5/d?q-ts{  
| first_db           | n1b:Bv4"]#  
| mysql              | j}B86oX  
| test               | zeuj  
+--------------------+ jwAYlnQ^EM  
4 rows in set (0.01 sec) Hnk&2bY  
数据库自动生成了 1=z[U|&R  
eh<mJL%T  
mysql> use first_db; 8$A0q%n  
Database changed MkoK(m{7  
mysql> show tables; Fy Ih\  
+--------------------+ } #H,oy;Dz  
| Tables_in_first_db | h>\C2Q  
+--------------------+ Q*>)W{H&)  
| first_tb           | w!20  
+--------------------+ /\/^= j  
1 row in set (0.00 sec) -`k>(\Q< d  
表也自动生成了 Qjj }k)  
;CCg]hX  
mysql> select * from first_tb; ]2@(^x'=  
+------+--------+ bPOPoq1#  
| id   | name   | v"1&xe^4  
+------+--------+ P;I,f  
|    1 | myself | .vKgiIC:  
+------+--------+ jF;<9-m&  
1 row in set (0.00 sec) my sXgS&S  
记录也按照我们的意愿存在了 +DSbr5"VlB  
%rs2{Q2k  
2、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。 '(r?($s  
顶端 Posted: 2008-08-26 21:10 | [楼 主]
帖子浏览记录 版块浏览记录
学盟技术交流中心 » 技术文章

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