mysql主从配置与mysql-router

系统环境

服务器A

  • 操作系统: ubuntu-server 18.0.4
  • ip地址: 10.0.1.180

  • mysql版本: mysql 8.0 (主服务器)

  • mysql-router版本: mysql-router 8.0

服务器B

  • 操作系统: ubuntu-server 18.0.4
  • ip地址: 10.0.1.181
  • mysql版本: mysql-8.0 (从服务器)

ps:从服务器的mysql版本尽量和主服务器一致,或者高于主服务器的版本

宿主机(测试用)

  • 操作系统: ubuntu 16.0.4
  • ip地址: 10.0.1.189
  • mysql版本: 5.7

任务目标

配置虚拟机A的mysql为主服务器,虚拟机B的mysql为从服务器,然后使用mysql-router对当前的主从配置服务器进行管理,最后模拟客户端链接测试

软件安装

  • 安装mysql-server和mysql-router

获取mysql的apt完整包

wget https://dev.mysql.com/get/mysql-apt-config_0.8.11-1_all.deb

安装

sudo dpkg -i mysql-apt-config_0.8.11-1_all.deb
 sudo apt update

安装mysql8.0和mysql-router8.0

sudo apt install mysql-server
 sudo apt install mysql-router

虚拟机B安装同上

主从服务器配置

  • 服务器A(主服务器)

编辑/etc/mysql/mysql.conf.d/mysqld.cnf ,配置server-id 并开启二进制日志

log_bin         = mysql-bin
server-id       = 1

重启mysql服务

sudo service mysql restart

登录mysql终端,然后创建从服务器账户,并授权

mysql> CREATE USER 'slave'@'10.0.1.181' IDENTIFIED BY '123456'; 
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.0.1.181';
mysql> flush privileges;

查看主服务器状态

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 1901
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
  • 同步服务器A的初态到服务器B

导出服务器A的数据 并拷贝到服务器B的home目录下

# 服务器A 
mysqldump -uroot -p --all-databases > db.sql
scp db.sql crisen@10.0.1.181:~/

导入服务器A的数据

# 服务器B
mysql > source db.sql;
  • 服务器B (从服务器)

编辑/etc/mysql/mysql.conf.d/mysqld.cnf ,配置server-id等从服务器配置

log_bin           = mysql-bin # 可选
server-id         = 2
relay_log         = /var/log/mysql/mysql-relay-log
log_slave_updates = 1
read_only         = 1

配置主服务器

mysql > change master to master_host='10.0.1.180',
     -> master_user='slave',
     ->  master_password='123456',
     ->  master_log_file='mysql-bin.000002',
     ->   master_log_pos=1901;

启动复制

mysql > start slave;

查看从服务器状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.1.180
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 1901
               Relay_Log_File: mysql-relay-log.000002
                Relay_Log_Pos: 1777
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ........ 省略 ..........
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Slave_IO_Running和Slave_SQL_Running同时为Yes的时候 就说明主从配置是成功 如果没有配置成功 可以通过查看Slave_SQL_Running_State的状态来检查错误原因

mysql router 配置

虽然很多的框架提供了让你可以把读写操作配置到不同的数据库上,但那是比较简单的情况下,更加复杂的情况当然是选择mysql的中间件来完成,使用专业的工具来做专业的事情,这也是为什么会有mysql中间件,而mysql router就是mysql官方开发的一款mysql中间件 尽管它不是最好的 但是足够让我们用来理解mysql中间件的运行方式了

  • 配置mysql router
[DEFAULT]
logging_folder = /var/log/mysqlrouter/
runtime_folder = /var/run/mysqlrouter
config_folder = /etc/mysqlrouter

[logger]
level = INFO

### 读写策略  写操作只允许主服务器
[routing:read_write]
bind_address           = 10.0.1.180
bind_port              = 9468
destinations           = 10.0.1.180
mode                   =  read-write
max_connections        = 65535
max_connect_errors     = 100
client_connect_timeout = 9

### 只读策略   读操作可以在主服务器和从服务器之间进行负载均衡方案
[routing:read_only]
bind_address           =  10.0.1.180
bind_port              =  9469
destinations           =  10.0.1.180,10.0.1.181
mode                   =  read-only
max_connections        = 65535
max_connect_errors     = 100
client_connect_timeout = 9

[keepalive]
interval = 60

详细的mysql-router配置 请自行查看官方文档 这里只做我需要的基本配置

如果在配置的过程中 发生了错误导致mysqlrouter进程没有启动 需要分析/var/log/mysqlrouter/mysqlrouter.log 来找出错误的原因

测试mysql router

配置了mysql router之后 我们所有的mysql服务器就相当于对客户端不可见了

根据上面的配置 我们得到了读写策略和只读策略的地址 分别如下

# 读写服务器
地址:10.0.1.180 
端口:9468
#  只读服务器
地址:10.0.1.181
端口:9468

创建一个对测试机可以链接的用户

mysql> CREATE USER 'crisen'@'10.0.1.189' IDENTIFIED BY '123456'; 
mysql> GRANT ALL ON *.* TO 'crisen'@'10.0.1.189';
mysql> flush privileges; ## 因为已经配置了主从同步 所以只需要在主服务器上创建就可以了  但是从服务器也上需要运行flush privileges命令来刷新权限

在宿主机上使用命令测试链接情况

  1. 写操作
mysql -h10.0.1.180  -ucrisen -P9468 -p123456 -e "select @@hostname;"
+------------+
| @@hostname |
+------------+
| ubuntu180  |
+------------+
  1. 读操作
mysql -h10.0.1.180  -ucrisen -P9469 -p123456 -e "select @@hostname;"
+------------+
| @@hostname |
+------------+
| ubuntu181  |
+------------+
mysql -h10.0.1.180  -ucrisen -P9469 -p123456 -e "select @@hostname;"
+------------+
| @@hostname |
+------------+
| ubuntu180  |
+------------+

写操作返回的是主服务器,如果是读操作,那么返回的服务器名称会自动的进行负载均衡方案,如果选择其中一个服务器down的话, 那么mysql router会自动的剔除这个操作

尽管主从复制可以提高数据库的负载,但是主从同步的这个过程中,数据的一致性是没有办法百分之百保证的,需要其他的解决方案,不过这是主从复制的缺点,并不是mysql-router的缺点

完全在linux下工作的感受

完全在linux下工作的感受

或许linux这个词语在很多的想象中,一定充满geek的样子,其实我想说,这其实只是你们想象中的样子,但是并不是linux的全部。时至2018年了,ubuntu桌面版已经非常强大了,而且在深度科技的努力下,很多日常用的软件,也都能在linux运行,尽管现在大部分的普通用户都转移到了移动端,但是对于pc用户来说,尤其是程序员这个群体,linux绝对是你非常好的帮手。

当你能够看到这篇文章的时候,那么我现在可以断定你至少对这个用户数量最庞大操作系统是非常感兴趣的,接下来我愿意讲一下我迁移到linux的过程,希望能够给到你们一些些的帮助

了解自身的需求

linux肯定是不适合所有人的,但是它非常的适合我。作为一个php后端程序员,和服务器打交道是没有办法避免的,而服务器基本上运行的都是linux操作系统,而且是纯命令行模式的,对于服务器来说,图形界面完全就是一种浪费。

那么对于我来说,我需要的操作系统应该是什么样的呢?

  • 首先我需要编程,我需要一个php的IDE
  • 我需要管理服务器,我需要顺手的终端
  • 我写程序的时候,有时候会需要听歌来防止被外界干扰,我需要一个听歌软件
  • 我会经常需要管理数据库,尽管我很熟悉mysql命令行,但是一个好用的图形化界面也能锦上添花
  • 我经常需要做很多的测试,而这些测试可能会损坏我的系统,那么我需要一个虚拟机软件
  • 我需要上网,我需要一个好用的浏览器
  • 我需要一个好用的输入法
  • 我喜欢markdown来写文档,所以我需要一个markdown编辑器
  • 有时候我需要调试接口,我需要一个好的接口调试工具
  • 或许我可能无法避免的接触到psd文件,我还需要一个可以操作图片的工具,就像photoshop那样
  • 除了编程之外,还有一些日常的琐碎事情,比如同事之间的沟通,我可能需要excel,word工具
  • 我没有办法避免的需要和其他同事沟通,我需要万恶的qq和微信
  • 我有时候需要画脑图,我需要一个脑图工具
  • 我不可避免的还需要画流程图,还需要一个流程图工具
  • 除了这些可见的程序以外,我可能还需要一些开发工具,比如版本控制,lnmap环境等等
  • 当然还有最重要的一点,我可能需要工具来访问stackoverflow来解决问题,这里需要一个被和谐的工具

首先我相信,我的这些需求,也绝对是大部分用户需要用的,而且我相信如果你用的windows或者mac操作系统,一般用的功能也都差不多。

在linux下应该如何满足自身的需求

我所选择的操作系统是ubuntu16.0.4,虽然它被戏称是基于“内部错误”构建的操作系统,或许它没有arch那么优雅,没有centos那么稳定,也没有openSUSE那么简约,但是它可以让我折腾少一点,至少对于两年前的我来说,它应该最易用的操作系统了。那么我怎样用它来迎合我这么的需求的呢

编程工具

虽然windows下有史上最强大的IDE-----“visual studio”,但是作为php程序员,我写的代码都是php,js,bash这些,史上最强IDE是无福消受了

但是我有phpstorm vscodevim

终端

ubunut下不用考虑终端的问题,ctrl+alt+t 直接就调出来了,极致体验,完美使用,尤其是在apt的强大包管理之下,更是丝滑的顺畅

听歌

这里要感谢"深度科技"和“网易云音乐”,linux下我的网易云音乐运行的非常的流畅

数据库管理工具

或许你觉得phpmyadmin配置很麻烦,mysqlworkbench很难用,命令行下运行又不太舒服,那你可以试试navicat for linux啊,尽管它是wine版的,但是一定可以满足你的需求

虚拟机

虚拟机vmware,virtualbox 本身就是支持linux版的,而且linux下的体验也非常的棒

浏览器

如果你对ie没有特别的感情的话,你可以试试firefox和google的浏览器啊

当然,如果你喜欢“某数字”浏览器的,抱歉 我不认识你

输入法

linux的的中文输入法,可能就没有什么什么太好的办法了,毕竟万恶的“某讯”,从不开发linux平台的软件,这里要感谢搜狗,虽然搜狗也是“某讯”旗下的,但是也改变不了腾讯万恶的事实,linux下的搜狗输入法,用起来感觉还行,除了翻页变成了"+""-"号,偶尔会抽风,其他都没有什么问题,而且编程我也几乎不使用中文,所以没什么太大的影响,而且ftix用起来也是不错的

markdown编辑器

如果你和我一样喜欢markdown语法的话,那么typora一定非常适合你,它可是可以支持windows,mac,linux三个平台的,感谢typora照顾到了我们这群linux用户

接口调试工具

虽然浏览器又很多这样的插件,但是仍然又强大的postman供你选择,linux的postman,你应该会非常喜欢的

图形图像处理

可能你的感觉是linux不太适合处理图形和图像,但是我想说这只是你的错觉,强大GIMP工具,一定可以给你不一样的体验

excel && word

你说你需要日常办公? 是的我有些时候也需要。开源,免费,没有任何捆绑的libreOffice你值得拥有,当然还有wps的软件,linux下用也是没有任何问题的

万恶的qq与微信

万恶的某讯太无耻了,qq和微信没有linux版本

但是这里我们有三个选择

  • 使用网页版
  • 使用手机,移动版用
  • 使用wine, 用老版本的qq 比如qq2012国际版(我用的就是这个,尽管有些抽风,凑合用了)

其实换句话说,没有qq和微信也是一件好事情,至少不用被太多繁琐的事情来打扰了

脑图

脑图又称思维导图,如果你喜欢脑图的话,不用担心xmind官方就提供了linux版

流程图工具

linux其实也有比较好用的流程图工具的,正如dia,它看起来就是那么的简约,毫不做作

其他服务类型的软件

  • 集成环境

如果你和我一样是个php程序员,那么你一定需要一个php的集成环境

如果你在windows下,那么你极有可能用的就是phpstudy和wanmp这两种

其实我真的很想说,这种集成环境其实真的并不适合你们,我们要做到的是对mysql apache nginx php这四个单独软件的掌控,集成起来会蒙蔽很多的细节,不利于成长

在linux,尽管也有集成环境给你选择,比如oneinstack,lanmp等等,但是如果用强大的apt工具,岂不是来的能加的痛快

sudo apt install nginx
sudo apt install mysql
sudo apt install php
  • composer

如果你用composer的话,那么你在windows下一定踩了非常多的坑,如果你在ubuntu下的话

sudo apt install composer

如此简单就可以拥抱composer

  • 版本控制

目前最流行的版本控制工具就是git了,如果你在windows下安装,还会附带一个git bash给你,而且用起来还不是特别好

但是在ubuntu下

sudo apt install git

没错,和composer一样,就是一条命令,然后调起终端就可以了

和谐工具

和谐工具我就不推荐了,但是我可以保证linux下用起来的感觉觉得更加的流畅

可能有些时候,有一些实在是只能windows运行的软件,比如万恶的“某讯”软件(X信开发者工具),那么我们还有非常好的解决方案,我们可以跑一个windows的虚拟机

我的windows虚拟机除了用来跑一下微信开发者工具做测试之外,就没有任何的用处了,万恶的“某讯”

为什么如此极力推荐linux

我如此推崇linux,并不是因为它可能显的高大上一点,而是真的可以为你的未来的道路点亮一盏启明灯。

linux有数不清的非常好用的软件,不同的软件相互组合,能够做到你甚至无法想象的任务。尽管它的学习曲线难度是有一些,但是你真的愿意掀开她的面纱,绝对受益无穷。

如果你和我一样是个程序员,那么你就无法避开服务器,而服务器一般都是linux操作系统,所以如果你的工作环境是linux,那么你一定可以更好的切换到服务器上工作。

如果你是个普通人,那么linux可以让你免受各种流氓软件的袭扰,包括但不限于"X度全家桶","数字全家桶",“企鹅全家桶”,从而提升你的使用体验。

如果你是一个爱学习的人,那么就更不应该错过linux了,使用linux可以让你明白更多的底层相关的知识,让你感受进程管理,文件管理,网络管理等等计算机内在的魅力。

服务器安全加强攻略(linux)

系统环境

  • cento7

故障现象

这几天同事找到我,说服务器好像被挂马了,让我去检查一下

ssh到服务器之后,输入lastb命令看了一下,出来出来一大堆的ip正在尝试破解服务器的密码

完全没有运维的服务器,是多么的脆弱,为了避免被对方用字典暴力破解了服务器

那么接下来就要对服务器的安全性进行加强了

解决过程

因为字典暴力破解都是猜用户名,然后用生成好的字典不断的对服务器进行尝试,然后获得shell权限

而且linux大多数服务器都有root用户,所以root用户的尝试次数必定是最多的,

为了增加对方的攻击成本,那么我们首先要做这样设置

  1. 创建普通用户

  2. 设置普通用户的sudoer权限

  3. 禁止root账户远程ssh登录

用普通用户来远程登录,并且sudo已经可以解决大多数问题了,实在需要root来执行某些任务的时候,再使用su root来切换到root执行,这样做的话,对方就需要猜测用户名,然后再猜测密码,攻击难度瞬间就提升了一大截

  • 创建普通用户并设置密码
useradd someuser && passwd someuser
  • 设置sudoer权限

打开/etc/sudoers

chmod u+w /etc/sudoers 
vim /etc/sudoers 

找到root ALL=(ALL) ALL 然后加上新创建的普通用户

root    ALL=(ALL)       ALL
someuser  ALL=(ALL)       ALL
  • 禁止root账户远程登录

打开ssh的配置文件 /etc/ssh/sshd_config

vim /etc/ssh/sshd_config  

找到 PermitRootLogin改成no,如果没有找到 那么添加一行

 PermitRootLogin no

接着重启sshd服务

/bin/systemctl restart sshd.service

如果不是centos服务器,使用的命令一般是service sshd restart

这样做就提高了很大的安全性了,但是这只是一个简单的隐藏而已,并不能真正的解决根本性的问题,只要给对方时间,猜测到账户和密码还是有可能的,为了一劳永逸,我们还需要把这些恶意的ip全都封掉,但是手动封肯定是不现实的,所以我们需要一个自动化的脚本,这个脚本的作用如下

检测10分钟内,尝试失败登录次数超过5次的ip,然后使用iptables把这些ip地址全都禁掉,然后把这个脚本设置为每十分钟执行一次 就可以自动的封禁这些ip了,至于这个脚本怎么写就很随意了,你可以用php python bash等任何一种脚本语言来实现这个过程,这里是我用bash写的一个简单的例子

#!/bin/bash

now=`date +'%H%M'`
start=`date +'%H%M' -d '-10min'`
lines=100000
iptables=/sbin/iptables
blacklist=./blacklist
limitnum=5
ipList=`lastb |   head -n ${lines} |  awk '{ gsub(/:/,"",$7); if($7>='${start}' && $7<='${now}') { tmpData[$3]++} } END{ for(i in tmpData){if(tmpData[i]>=7){print i}} }'`

if [ ! -f ${blacklist} ];then 
    echo ""  > ${blacklist}
fi

for ip in  ${ipList};do
    if [  `cat ${blacklist} | grep ${ip} | wc -l`  -eq 0 ];then
        echo ${ip} >> ${blacklist}
        ${iptables} -D INPUT -s  ${ip} -p tcp --dport 22 -j DROP
    fi
done

尾语

我发现很多公司基本都不注重linux服务器的安全性,我大概看了一下攻击我方服务器的大部分ip,基本上都是别人的肉鸡,而且都是自动化批量式的扫描。像这种扫描,一旦你的服务器被命中并且破解成功,就变成一台新的肉鸡了,然后就会继续去感染其他的机器,如此这样反复的感染下去,最后被感染的机器就越来越多,整个网络里都充满了无用的数据包。所以为了整个网络环境的安全性,我希望所有使用linux服务器的人,都应该掌握一点点基本的linux的防范,不要让自己珍爱的服务器变成了其他人手中的武器。