From 88e96747e3f56beee5f40e4ab3f5d0a259da3797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 24 Jan 2024 18:11:58 +0300 Subject: [PATCH 1/2] Add Redis replica recipe and role --- roles/redis_replica.rb | 15 +++++++++++++++ roles/redis_server.rb | 3 +-- site-cookbooks/kosmos_redis/recipes/backup.rb | 11 +++++++++++ .../kosmos_redis/recipes/default.rb | 16 +++++----------- .../kosmos_redis/recipes/replica.rb | 19 +++++++++++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 roles/redis_replica.rb create mode 100644 site-cookbooks/kosmos_redis/recipes/backup.rb create mode 100644 site-cookbooks/kosmos_redis/recipes/replica.rb diff --git a/roles/redis_replica.rb b/roles/redis_replica.rb new file mode 100644 index 0000000..ddcc9d1 --- /dev/null +++ b/roles/redis_replica.rb @@ -0,0 +1,15 @@ +name "redis_replica" + +run_list %w( + kosmos_redis::replica + kosmos_redis::firewall +) + +default_attributes({ + 'redisio' => { + 'default_settings' => { + 'slaveservestaledata' => 'yes', + 'slavereadonly' => 'yes' + } + } +}) diff --git a/roles/redis_server.rb b/roles/redis_server.rb index f7fb88e..e50219b 100644 --- a/roles/redis_server.rb +++ b/roles/redis_server.rb @@ -7,6 +7,7 @@ default_run_list = %w( production_run_list = %w( kosmos_redis::default kosmos_redis::firewall + kosmos_redis::backup ) env_run_lists( @@ -14,5 +15,3 @@ env_run_lists( 'development' => default_run_list, 'production' => production_run_list ) - -default_attributes({}) diff --git a/site-cookbooks/kosmos_redis/recipes/backup.rb b/site-cookbooks/kosmos_redis/recipes/backup.rb new file mode 100644 index 0000000..44041f6 --- /dev/null +++ b/site-cookbooks/kosmos_redis/recipes/backup.rb @@ -0,0 +1,11 @@ +# +# Cookbook Name:: kosmos_redis +# Recipe:: backup +# + +databases = node['redisio']['servers'].map do |server, _| + "dump-#{server['port']}" +end +node.override["backup"]["redis"]["databases"] = databases + +include_recipe "backup" diff --git a/site-cookbooks/kosmos_redis/recipes/default.rb b/site-cookbooks/kosmos_redis/recipes/default.rb index 7153aca..dfc0031 100644 --- a/site-cookbooks/kosmos_redis/recipes/default.rb +++ b/site-cookbooks/kosmos_redis/recipes/default.rb @@ -3,16 +3,10 @@ # Recipe:: default # +node.normal['redisio']['servers'] = [{ + 'port' => '6379', + 'protected_mode' => 'no' +}] + include_recipe 'redisio::default' include_recipe 'redisio::enable' - -unless node.chef_environment == "development" - include_recipe "kosmos_redis::firewall" - - # Backup the databases to S3 - databases = node['redisio']['servers'].map do |server, _| - "dump-#{server['port']}" - end - node.override["backup"]["redis"]["databases"] = databases - include_recipe "backup" -end diff --git a/site-cookbooks/kosmos_redis/recipes/replica.rb b/site-cookbooks/kosmos_redis/recipes/replica.rb new file mode 100644 index 0000000..d968c7b --- /dev/null +++ b/site-cookbooks/kosmos_redis/recipes/replica.rb @@ -0,0 +1,19 @@ +# +# Cookbook Name:: kosmos_redis +# Recipe:: replica +# + +primary_host = search(:node, 'role:redis_server').first['knife_zero']['host'] rescue nil + +if primary_host.nil? + Chef::Log.warn("No node found with 'redis_server' role. Stopping here.") + return +end + +node.normal['redisio']['servers'] = [{ + 'port' => '6379', + 'replicaof' => { 'address' => primary_host, 'port' => '6379' } +}] + +include_recipe 'redisio::default' +include_recipe 'redisio::enable' From 7d478f0183ad3e5f6d3215671048da867db70781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 24 Jan 2024 18:12:22 +0300 Subject: [PATCH 2/2] Set up Redis replication in production --- nodes/redis-1.json | 6 ++++-- nodes/redis-2.json | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/nodes/redis-1.json b/nodes/redis-1.json index a5507e7..cd0fb79 100644 --- a/nodes/redis-1.json +++ b/nodes/redis-1.json @@ -1,5 +1,6 @@ { "name": "redis-1", + "chef_environment": "production", "normal": { "knife_zero": { "host": "10.1.1.225" @@ -8,7 +9,7 @@ "automatic": { "fqdn": "redis-1", "os": "linux", - "os_version": "5.4.0-1090-kvm", + "os_version": "5.4.0-1104-kvm", "hostname": "redis-1", "ipaddress": "192.168.122.83", "roles": [ @@ -22,6 +23,8 @@ "kosmos_kvm::guest", "kosmos_redis", "kosmos_redis::default", + "kosmos_redis::firewall", + "kosmos_redis::backup", "apt::default", "timezone_iii::default", "timezone_iii::debian", @@ -43,7 +46,6 @@ "redisio::disable_os_default", "redisio::configure", "redisio::enable", - "kosmos_redis::firewall", "backup::default", "logrotate::default" ], diff --git a/nodes/redis-2.json b/nodes/redis-2.json index 38735df..07be0f5 100644 --- a/nodes/redis-2.json +++ b/nodes/redis-2.json @@ -1,5 +1,6 @@ { "name": "redis-2", + "chef_environment": "production", "normal": { "knife_zero": { "host": "10.1.1.208" @@ -8,17 +9,20 @@ "automatic": { "fqdn": "redis-2", "os": "linux", - "os_version": "5.4.0-1090-kvm", + "os_version": "5.4.0-1104-kvm", "hostname": "redis-2", "ipaddress": "192.168.122.98", "roles": [ "base", - "kvm_guest" + "kvm_guest", + "redis_replica" ], "recipes": [ "kosmos-base", "kosmos-base::default", "kosmos_kvm::guest", + "kosmos_redis::replica", + "kosmos_redis::firewall", "apt::default", "timezone_iii::default", "timezone_iii::debian", @@ -32,7 +36,14 @@ "postfix::_common", "postfix::_attributes", "postfix::sasl_auth", - "hostname::default" + "hostname::default", + "redisio::default", + "redisio::_install_prereqs", + "redisio::install", + "redisio::ulimit", + "redisio::disable_os_default", + "redisio::configure", + "redisio::enable" ], "platform": "ubuntu", "platform_version": "20.04", @@ -51,6 +62,7 @@ }, "run_list": [ "role[base]", - "role[kvm_guest]" + "role[kvm_guest]", + "role[redis_replica]" ] } \ No newline at end of file