天天看点

mysql主从服务器配置

假如一个业务场景,测试后,读写比列为1:20,根据读写比例,合理设置优化方案。

读写比列:

写数据/读数据比例,    insert/update/delete    /  select

从“读写分离”概念推导实现基本要素:

一般来说,读服务器就是指写服务器的数据镜像。

从服务器端看:要有N台从服务器和主服务器保持数据一致。

从客户端看:比如有一条insert语句和一条select语句,

则要区分读/写语句,并且分别请求从/主服务器。

服务器端读写分离的具体技术

1:数据库集群技术

集群由3个概念

(1)sql节点    sql node

(2)数据节点    data node

(3)管理节点    ndb managerment

sql语句发送“1sql节点”,“1sql”节点发往“2数据节点”,再由3管理节点完成数据节点之间的同步。

集群技术相对复杂,至少有3种节点,4台服务器才能完成。

2,数据库复制

写/master(0)      同步        读/slave(1)

3,数据库复制replication的实现原理

(1)主服务器凡运行语句,都产生一个二进制日志 binlog

(2)从服务器不断读取主服务器的binlog

(3)从服务器读取到的binlog,转换为自身可执行的relaylog

(4)执行relaylog

4,实现步骤:

(1)首先确保主服务器打开二进制日志功能

这样,主服务器一旦有数据变化,立即产生二进制日志

(2)从服务器也需要开启二进制日志和relay日志功能

这样可以从主服务器读取binlog,并产生relaylog

(3)在主服务器建立一个从服务器的账号,并授予最高权限

(4)指定从服务器对应的主服务器,开启从服务器

具体实施

假如一台虚拟机xp,和一台linux

(1)在虚拟机xp下安装mysql作为从服务器

(2)在linux下编译mysql,作为主服务器

(3)保证xp与linux的3306端口互通

(4)配置主服务器,打开binlog

    mysql>show master status;

    Empty set (0.00 sec)

    #开启二进制日志

    log-bin=mysql-bin

    #给服务器起一个唯一的id

    serve-id=1

    #指定日志格式

    binlog-format=mixd/row/statement

重启mysql

会多两个文件:mysql-bin.000001和mysql-bin.index

已经能够充当master服务器

5,配置从服务器打开binlog和relaylog

    mysql>show slave status;

    [mysql]

    #slave config

    log_bin    =mysql-bin

    server_id    =2

    relay_log    =mysql-relay-bin

    log_slave_updates    =1

    read_only    =1

重启从服务器

6,在主服务器上创建相应的复制账号

    mysql>grant replication slave,replication client

        ->on *.*

        ->to repl@'192.168.2.%' identified by '111111';

    Query OK, 0 rows affected (0.02 sec)

    mysql>flush privileges;

    Query OK,0 rows affected (0.00 sec)

7,在从服务器通过语句指定要复制的主服务器(注意,可以一主多从,不可以一从多主)

    mysql>change master to

        ->master_host='192.168.2.99',(主服务器ip)

        ->master_user='repl',

        ->master_password='111111',

        ->master_log_file='mysql-bin.000001',

        ->master_log_pos=0;

    Query OK, 0 rows affected (0.08 sec)

8,启动从服务器功能

    ->start slave;

9,测试

如何在客户端应用的时候,路由语句

一般用两种方法

(1)直接在PHP的mysql类做判断,最简单,不用额外加软件

比如discuz论坛。

代码:

//下面这个mysql类,不仅仅是一个mysql类,还充当一个sql语句的路由功能。

class mysql{

    $dbm=主服务器;

    $dbs1=从服务器1;

    $dbs2=从服务器2;

    public function query(){

        在query里面进行语句判断

        分别连接不同的mysql服务器

    }

}

new mysql

mysql->query();