网站首页linux

两台服务器做Mysql数据库的读写分离及Nginx负载均衡

发布时间:2022-03-19 07:51:30编辑:slayer.hover阅读(830)

    一. 部署两台Linux服务器, 安装环境Ubuntu18.4, Redis6.2, Mysql5.7, PHP8.0

        主库服务器:   192.168.1.100
               从库服务器:   192.168.1.101

    二.配置mysql主从

        主库配置:

        1>主库修改mysql配置,打开主库配置文件my.cnf, 插入

    [mysqld]
    log-bin=mysql-bin #开启二进制日志
    server-id=1 #设置server-id
            
    binlog-do-db = blog #只同步blog库
    binlog-ignore-db = test #不同步test库
    binlog-ignore-db  =  mysql #不同步mysql库

            重启mysql.

     

       2>主库创建用于同步的用户账号, (进入主库mysql命令行)

    mysql> CREATE USER 'blog'@'192.168.1.101' IDENTIFIED BY '123456';#创建用户
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'blog'@'192.168.1.101';#分配权限
    mysql> flush privileges;   #刷新权限


        3>主库查看master状态,记录二进制文件名File字段值(mysql-bin.000003)和位置Position字段值(73):

    mysql > SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File      | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000006 | 1034 | blog    | test,mysql   |
    +------------------+----------+--------------+------------------+


    ---------------------------------------------------------


        从库配置:

        1>从库修改mysql配置, 打开从库配置文件my.cnf, 插入

    [mysqld]
    server-id=2 #设置server-id,必须唯一


        2>从库执行同步SQL语句, (进入从库mysql命令行)

    mysql>change master to 
       master_host='192.168.1.100',
       master_user='blog',
       master_password='123456',
       master_log_file='mysql-bin.000006', 
       master_log_pos=1034;


        3>从库启动slave同步进程

    mysql>start slave;

        

        4>从库查看slave状态

    mysql>show slave status;


    若无报错, 此时mysql主从已准备就绪, 在主库里更新blog库里的任意数据, 从库都可以实时看到更新.


    若报错:     The slave I/O thread stops because master and slave have equal MySQL server UUIDs; 

    即主从架构中使用了相同的UUID.

    解决方法:   

    更新mysql的auto.cnf文件, MySQL启动时,会自动从mysql_data_dir/auto.cnf 文件中获取server-uuid值,

    并将这个值存储在全局变量server_uuid中。

    如果这个值或者这个文件不存在,那么将会生成一个新的uuid值,并将这个值保存在auto.cnf文件中.


    mv /mysql_data_dir/auto.cnf  /mysql_data_dir/auto.cnf.bk
    service mysql restart
    cat /mysql_data_dir/auto.cnf  #此时已经有了一个新的server-uuid值


    三. 配置网站数据库读写分离,  修改laravel的database配置


    'mysql' => [
        /*读写分离*/
        'read' => [
            'host' => [
                '192.168.1.100',
                '192.168.1.101',
            ],
        ],
        'write' => [
            'host' => ['192.168.1.100'],
            ],
        ...
    ]



    四.配置nginx负载均衡

        1>在两台服务器上Nginx均配置同样的网站内容.

                192.168.1.100上

    server {    
        listen        8080;
        server_name  192.168.1.100;
        root   /data/wwwroot;
                ...
    }

                192.168.1.101上

    server {    
        listen        8080;
        server_name  192.168.1.101;
        root   /data/wwwroot;
                ...
    }


        2>在主库上的nginx配置中添加

    upstream mysvr {     
            server 192.168.1.100:8080 weight=1 max_fails=3 fail_timeout=3;
            server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=3;
    }
    server {
        listen        80;
        location  ~*^.+$ {         
                    proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
        }
    }



    五. 配置两台服务器的session共享

        

        1> 在192.168.1.101上安装redis, 配置两台服务器均可访问

        2> 给两台服务器安装redis扩展, 并将php session指向到上面安装好的redis上.

        3> 重启phpfpm, 完成.

评论