分类
Laravel

MySQL主备实践记录与Laravel项目结合应用

  1. 从数据库(Slave)是主数据库(Master)的备份,当主数据库变化时从数据库要同步更新,这是提高信息安全的手段。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。
  2. 应用一般读操作要频繁于写操作,因此要有多个读数据库来均衡用户的大量读操作。
  3. 在Master机器上的操作:在master上的数据发生变化时,该事件变化会按照顺序写入bin-log中,当slave连接到master的时候,master机器会为slave开启binlog dump线程,当master的binlog发生变化的时候,bin-log dump线程会通知slave,并将响应的binlog内容发送给slave。
  4. 在Slave机器上的操作:当主从同步开启的时候,slave上会创建两个线程,I\O线程,该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I\O线程。该I\O线程接收到binlog内容后,再将内容写入到本地的relay log
  5. 双机热备即两台Mysql服务器互为主备,以下只记录一个方向的主备设置。
  6. 两台服务器A(主服务器) ip: 192.168.119.128, B(从服务器) ip: 192.168.119.130, 网络ping的通。
  7. A (主服务器)的配置:登录mysql数据库,输入命令 mysql -u root -p, 然后根据提示输入密码,接着在A上面创建专门用于备份的用户,用来让B登录A来备份数据所用 grant replication slave on *.* to 'slave1'@'192.168.119.130' identified by '123456';, 其中slave1是用户名,192.168.119.130是B(从服务器)的ip地址,密码为123456
  8. 在主从两台服务器上分别创建名字相同的数据库,并用相同的sql来创建数据库表结构,参考命令 mysql -u root -p newdatabase < /path/to/newdatabase.sql
  9. 开启A服务器Mysql的binary-log。以root权限编辑文件/etc/mysql/mysql.conf.d/mysqld.cnf,在文件中注释掉bind-address这一行,然后设置server-id = 1, log_bin = /var/log/mysql/mysql-bin.log, binlog_format = mixed, binlog-do-db = 要同步的数据库名称, auto-increment-increment = 10, auto-increment-offset = 1. 设置完保存,退出文本编辑,然后重启mysql服务 sudo service mysql restart
  10. 获取主服务器状态和同步状态。查看A服务器的binary日志位置,show master status\G, 记住File和Position,接下来在设置从服务器的时候需要用到。
  11. B(从服务器)配置。登录B服务器Mysql数据库,以root权限编辑文件/etc/mysql/mysql.conf.d/mysqld.cnf, 设置server-id = 2 必须保证每台服务器不一样,binlog_format = mixed, log_bin = /var/log/mysql/mysql-bin.log, replicate-do-db = 要同步的数据库名称, relay-log = mysql-relay-bin, log-slave-updates = ON. 保存文件,重启Mysql服务。
  12. 开始同步。在B(从服务器)中登录mysql,输入CHANGE MASTER TO MASTER_HOST = '192.168.119.128', MASTER_USER = 'slave1', MASTER_PASSWORD = '123456', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 510, 其中log文件的文件名和位置为之前记录的。
  13. 重启mysql,然后执行show slave status\G 通过查看是否slave_IO_Running 及 slave_SQL_Running 均为 Yes 说明slave线程开启成功
  14. 之后就可以测试了。
  15. Laravel中数据库的配置 。在config/database.php文件中配置数据库的读写分离,'read' => [ 'host' => [ '192.168.119.128', '192.168.119.130' ], ], 'write' => [ 'host' => [ '192.168.119.128', '192.168.119.130' ], ], 'sticky' => true, 分别把两台数据库的ip地址都填写在读写的host数组中,并配置'sticky' => true. 建议两个数据库的用户名密码设置成一样的。
  16. ubuntu 18.04 首次登录mysql未设置root密码或忘记密码解决方法。命令行输入 sudo cat /etc/mysql/debian.cnf 其中有一个用户 debian-sys-maint 密码为password后面的。输入 mysql -u debian-sys-maint -p 输入刚查看到的密码。然后修改root的密码 use mysql; // 下面这句命令有点长,请注意。 update mysql.user set authentication_string=password('root') where user='root' and Host ='localhost'; update user set plugin="mysql_native_password"; flush privileges; quit; 重启mysql服务后即可以修改后的密码登录root账户
  17. 解决Host ‘X.X.X.X’ is not allowed to connect to this MySQL server问题的方法。登录mysql,use mysql;update user set host = '%' where user = 'root'; flush privileges; 再次连接即可解决
分类
Laravel

Ubuntu 18.04开机启动PHP Workerman、GatewayWorker的配置方法(亲测可用)

Ubuntu 18.04不能像之前的版本那样直接通过编辑rc.local文件来设置开机启动脚本,不过,通过如下的配置,可以让rc.local重新发挥作用。

1. 建立rc-local.service文件

sudo vi /etc/systemd/system/rc-local.service

2. 将下列内容复制并粘贴进rc-local.service文件

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
 
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
 
[Install]
WantedBy=multi-user.target

3. 创建文件 rc.local

sudo vi /etc/rc.local

4. 将下列内容复制并粘贴进rc.local 文件

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sleep 30
cd /home/vagrant/code/kttCRM/ && /usr/bin/php artisan gateway-worker:server start --daemon
exit 0

在这个文件里,把开机执行的脚本放在exit 0的上面。需要注意,sleep 30表示在执行脚本之前等待30秒钟的时间,以确保PHP启动完毕,否则会出现无法执行命令的情况,可以适当延长等待的时间。

补充:针对docker的环境,在docker-compose exec命令中加入-T选项,开启tty。

cd /home/crm/kttCRM && sudo docker-compose exec -T app /usr/local/bin/php artisan gateway-worker:server start --daemon

5. 给rc.local文件加上可执行权限

sudo chmod +x /etc/rc.local

6. 启动服务

sudo systemctl enable rc-local

7. 启动服务并检查状态

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

可以看到以下的输出说明已成功启动Workerman、GatewayWorker服务进程:

vagrant@homestead:/etc$ sudo systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2020-04-06 15:03:35 CST; 1h 41min ago
  Process: 1351 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
    Tasks: 6 (limit: 2317)
   CGroup: /system.slice/rc-local.service
           ├─3018 WorkerMan: master process  start_file=/home/vagrant/code/kttCRM/artisan
           ├─3021 WorkerMan: worker process  Gateway websocket://0.0.0.0:23460
           ├─3037 WorkerMan: worker process  BusinessWorker none
           ├─3038 WorkerMan: worker process  BusinessWorker none
           ├─3039 WorkerMan: worker process  BusinessWorker none
           └─3040 WorkerMan: worker process  Register text://0.0.0.0:12360

Apr 06 15:03:35 homestead rc.local[1351]: --------------------------------------------- WORKERMAN ------Apr 06 15:03:35 homestead rc.local[1351]: Workerman version:3.5.25          PHP version:7.4.0
Apr 06 15:03:35 homestead rc.local[1351]: ---------------------------------------------- WORKERS -------Apr 06 15:03:35 homestead rc.local[1351]: proto   user            worker            listen              
Apr 06 15:03:35 homestead systemd[1]: Started /etc/rc.local Compatibility.
Apr 06 15:03:35 homestead rc.local[1351]: tcp     root            Gateway           websocket://0.0.0.0:Apr 06 15:03:35 homestead rc.local[1351]: tcp     root            BusinessWorker    none                
Apr 06 15:03:35 homestead rc.local[1351]: tcp     root            Register          text://0.0.0.0:12360Apr 06 15:03:35 homestead rc.local[1351]: --------------------------------------------------------------Apr 06 15:03:35 homestead rc.local[1351]: Input "php gateway-worker:server stop" to stop. Start success.

至此,可以重启服务器,会看到服务已经自动启动了。

3820 ?        S      0:00 WorkerMan: worker process  Gateway websocket://0.0.0.0:23460
 3821 ?        S      0:00 WorkerMan: worker process  BusinessWorker none
 3822 ?        S      0:00 WorkerMan: worker process  BusinessWorker none
 3823 ?        S      0:00 WorkerMan: worker process  BusinessWorker none
 3824 ?        S      0:00 WorkerMan: worker process  Register text://0.0.0.0:12360