背景
今天看监控发现mysql5.7 主库有slow query,去日志里检查发现是一个select * 操作,而且明显是人为查询,想建议开发人员去从库查询,奈何推动比较费劲,所以只能想办法在根上解决,首先想到的就是主从连接访问分别作限制,因为postgresql 的 pg_hba.conf 可以这么干,看了mysql5.7 文档发现与 postgresql 对连接访问控制有很大区别,特意整理记录一下
连接访问控制:
mysql主要是通过my.cnf中的 "bind-address" 参数 与 mysql.user表中 "host" 字段来控制
postgresql 主要是通过 postgresql.conf 中 "listen_addresses" 参数 与 pg_hba.conf 配置文件来控制
bind-address 和 listen_addresses
这两个参数值要么是0.0.0.0 或者 * 或者 ::,接受所有地址监听,要么是固定IP或主机名
bind-address不支持ip网段或者多ip设置
listen_addresses可以用逗号分隔的主机名和/或数字 IP 地址列表
不指定服务所在的服务器监听,数据库启动会报错
都需要在服务启动之前在参数文件中设置好,mysql可以在启动服务时用--bind-address=addr指定
如果修改都需要重启服务
所以,这里只能设置为接受所有地址监听
mysql.user表 和 pg_hba.conf 文件
mysql5.7 创建用户的方式有两种
第一种是用create user 命令
create user 'username'@'hostname' identified by 'password';
第二种是用grant命令以赋权限的方式
grant privileges to 'username'@'hostname' on dbname.obname identified by 'password';
这两种创建用户方式有一个共同点,就是在创建用户的时候都会指定哪些地址可以用此用户来访问数据库,
host_name value 可以是固定ip或主机名、域名,也可以是一个地址段,具体的可以参考官网;
由于这种方式使用sql命令来实现的,所以如果有从库,从库会把sql重放,这些地址同样可以使用此用户来访问从库,但由于从库开启了read_only参数,所以从库只读,所以没有办法在数据库这分别去做主从控制访问(当然你可以创建多个用户,用不通的host_name来限制,这样出现数据库有N个相同user;当然你也可以放弃主从一致性,用超户在从库创建一个普通用户来使用),可以在防火墙策略这块入手,也可以添加代理如proxysql
postgresql 创建用户和赋权是分开的且简单明确的,访问控制的活交给了pg_hba.conf文件来管理
pg_hba.conf 文件的常用格式是每行一条的一组记录,可以接受local(unix 域套接字连接)、host(TCP/IP连接)以及hostssl 和 hostnossl 的连接方式,记录格式是
local database user auth-method [auth-options]
host database user address auth-method [auth-options]
hostssl database user address auth-method [auth-options]
hostnossl database user address auth-method [auth-options]
host database user IP-address IP-mask auth-method [auth-options]
hostssl database user IP-address IP-mask auth-method [auth-options]
hostnossl database user IP-address IP-mask auth-method [auth-options]
这里address、IP-address、IP-mask可以实现使用主机名,IP地址及IP范围的方式来访问,auth-method可以是trust(无条件信任)、reject(无条件拒绝)、md5(scram-sha-256或md5)等方式访问,这几种方式可以混合搭配使用,比如我可以允许除了某个ip地址以外,它所在网段的其他ip地址访问
pg_hba.conf的访问控制方式是通过配置文件来实现的,主从可以各自配置而不会影响主从数据库的一致性(postgresql 的从库是完全只读的,即使你是超户也不能进行写操作)