mysql 主从复制读写分离实现

来源:互联网 发布:只读文件数据怎么修改 编辑:程序博客网 时间:2024/06/05 20:32

mysql主从复制

(一) 安装mysql(主从服务器皆相同)

1、先创建用户和用户组

useradd mysql -s /sbin/nologin

groupadd mysql

usermod -G mysql mysql

2、安装*gcc*包和mysql

yum install *gcc*

tar zxvf mysql-5.0.45.tar.gz

cd mysql-5.0.45

./configure--prefix=/usr/local/mysql  --localstatedir=/opt/data--with-extra-charsets=utf8,gb2312,gbk --with-pthread —enable-thread-safe-clientwith-named-curses-libs=/usr/lib/libncursesw.so.5

:配置过程指定数据文件的位置及另加的字符集.

make

make install

cpsupport-files/my-large.cnf   /etc/my.cnf

cd /usr/local/mysql

chgrp -R mysql .

生成基本的数据库和表:  /usr/local/mysql/bin/mysql_install_db —user=mysql,成功执行后察看数据目录/opt/data,看是否有文件或目录生成.

chown -R mysql:mysql /opt/data

记得给每个数据库设置root密码.

/usr/local/mysql/bin/mysqladmin–u root password ‘redhat’
(
)修改配置文件
不同的地方就是server-id,主服务器配置文件不用修改,从服务器的配置文件server-id=10.其他的内容基本相同.
(
)启动服务
/usr/local/mysql/bin/mysqld_safe --user=mysql&
这个过程主辅服务器都相同.
(
)授权(在主服务器上进行)

grant replication slave on *.* to'repl'@'192.168.10.115' identified by 'baf9919708ec672c76b5948d03297114';

flush privileges;

!!重启服务

ps –ef | grep mysqld

Kill -9 xxxx

/usr/local/mysql/bin/mysqld_safe--user=mysql&

 

()查询主数据库状态(主服务器上进行)
mysql>
show master status;
+------------------+----------+--------------+------------------+
| File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      235 |             |                 |
+------------------+----------+--------------+------------------+
记下fileposition的值,后面做从服务器操作的时候需要用.
(
)配置从服务器

binlog.000008 |     6466
mysql> CHANGE MASTER TOMASTER_HOST='192.168.10.113',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='baf9919708ec672c76b5948d03297969',MASTER_LOG_FILE='binlog.000008',MASTER_LOG_POS=6466;

正确执行后再执行:
mysql> start slave;
就启用了复制功能.这里我们运行一下 mysql> show slave status\G来检查一下,一个正常的输出结果应该如下面的形式:
mysql>
show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waitingfor master to send event
                Master_Host:192.168.8.101
                Master_User:rep1
                Master_Port:3306
              Connect_Retry:60
            Master_Log_File:mysql-bin.000003
        Read_Master_Log_Pos: 235
             Relay_Log_File:-relay-bin.000009
              Relay_Log_Pos:235
      Relay_Master_Log_File: mysql-bin.000003
           Slave_IO_Running:Yes
          Slave_SQL_Running: Yes

            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                Last_Errno: 0
                Last_Error:
               Skip_Counter:0
        Exec_Master_Log_Pos: 235
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos:0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)
请注意:slave_IO进程及slave_SQL进程都必须正常运行,在状态输出重表现为:  Slave_IO_Running:Yes  Slave_SQL_Running:Yes否则都是不正确的状态(如一个值Yes,另外一个是NO则不行).
(
)主数据库有数据的情况:
1
、数据库锁表操作,不让数据再进行写入动作。mysql>FLUSH TABLES WITH READ LOCK
2
、察看主数据库的状态 mysql> show master status;照第(五)步记录输出值。
3
、把主服务器数据文件复制到从服务器,最好先用tar处理一下。
4
、取消主数据库锁定 mysql>UNLOCK TABLES
5
、从服务器的操作。跟前面的步骤一样(略过)
     
mysql代理安装配置

一、安装mysql-proxy.需要按下列顺序安装其所依赖的包:
(
)安装LUA
tar zxvf lua-5.1.tar.gz –C /usr/local
cd /usr/local

mv lua-5.1 lua

cd lua

make posix
make install
[root@localhost lua]#export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L /usr/local/lib -llua -ldl"LDFLAGS="-lm"

()安装libevent
tar zxvf libevent-1.1a.tar.gz
cd libevent-1.1a
./configure --prefix=/usr/local/libevent
make
make install

(
)安装check
tar zxvf check-0.8.4.tar.gz
cd check-0.8.4
./configure
make
make install


(
)安装mysql(只安装mysql客户端即可)
tar zxvf  mysql-5.0.45.tar.gz
cd mysql-5.0.45
./configure --prefix=/usr/local/mysql  --without-server -–with-named-curses-libs=/usr/lib/libncursesw.so.5

make
make install

(
)安装mysql-proxy

tar -zxvfmysql-proxy-0.6.1-linux-rhel4-x86-32bit.tar.gz -C /usr/local/

cd /usr/local/

mv mysql-proxy-0.6.1-linux-rhel4-x86-32bit/mysql-proxy

[root@localhost sbin]# exportPATH=$PATH:/usr/local/mysql/mysql-proxy/bin/

 

二、主要的命令行选项
--help-all
显示所有的帮助选项
--admin-address=host:port
管理主机及端口,默认是4041
--proxy-address=host:port
代理服务器的监听地址及端口,默认4040
--proxy-read-only-addresses=host:port
只读连接时,代理服务器的监听地址及端口。默认4042
--proxy-backend-addresseses=host:port
连接真实服务器的地址及监听端口,默认是3306,这是mysql代理最重要的选项,多个主机之间用空格隔开。使用rr算法。
--proxy-lua-script=file
指定lua脚本的名称

三、使用方法
2
mysql服务器的情形
mysql-proxy \
     --proxy-backend-addresses=mysql_ip1:3306 \
     --proxy-backend-addresses=mysql_ip2:3306
3
个服务器的情形:一个主服务器,负责写入;2个从服务器,负责查询。
mysql-proxy --proxy-backend-addresses= :3306\
         --proxy-read-only-address=:3306 \
         --proxy-read-only-address=:3306


四、mysql-proxy启动
编写脚本/usr/local/mysql-proxy/sbin/mysql-proxy.sh其内容如下:
#!/bin/bash

LUA_PATH="/usr/local/mysql-proxy/share/doc/mysql-proxy/?.lua"/usr/local/mysql-proxy/sbin/mysql-proxy--proxy-read-only-backend-addresses=172.24.0.152:3306--proxy-backend-addresses=172.24.0.151:3306—proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua&


chmod 755 /usr/local/bin/mysql-proxy.sh;
测试代理服务器:

mysql -u A -h 172.24.1.254 -P 4040 -p
配置验证
1
、主从复制测试:在主数据库服务器上创建库和表,然后再插入记录,再登陆到从服务器,看是否也建立相一致的库和表以及记录。
mysql> create database first_db;
Query OK, 1 row affected (0.01 sec)
在主数据库服务器创建库first_db

mysql> create table first_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)
在主数据库服务器创建表first_db

mysql> insert into first_tb values (001,'myself');
Query OK, 1 row affected (0.00 sec)
在主数据服务器的表first_db中插入记录
现在转到从数据库服务器,看是否同步了上面主数据库的数据
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
|
first_db           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.01 sec)
数据库自动生成了

mysql> use first_db;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_first_db |
+--------------------+
| first_tb           |
+--------------------+
1 row in set (0.00 sec)
表也自动生成了

mysql> select * from first_tb;
+------+--------+
| id   | name   |
+------+--------+
|    1 | myself |
+------+--------+
1 row in set (0.00 sec)
记录也按照我们的意愿存在了
2
、读写分离:用mysql客户端程序如mysql登陆到mysql代理,然后执行读写操作,以测试读写分离的正确性。

0 0
原创粉丝点击