-
Notifications
You must be signed in to change notification settings - Fork 0
/
cassandra.py
140 lines (99 loc) · 3.01 KB
/
cassandra.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
from fabric.api import run, env, task, roles, parallel, execute
from fabric.contrib.files import exists
from fabric.contrib.files import sed
from fabric.contrib.files import append
from utils import extract_host
CASSANDRA_CONFIG_FILE = '/etc/cassandra/cassandra.yaml'
@task
@roles('db')
@parallel
def install():
install_package()
configure()
@task
@roles('db')
@parallel
def uninstall():
purge_package()
clean()
def purge_package():
run('aptitude purge cassandra --assume-yes')
def install_package():
import_repository_gpg_key()
fill_repository_settings()
run('aptitude install cassandra --assume-yes')
def import_repository_gpg_key():
KEY = '4BD736A82B5C1B00'
run('gpg --keyserver pgp.mit.edu --recv-keys ' + KEY)
run('gpg --export --armor ' + KEY + ' | apt-key add -')
def fill_repository_settings():
append('/etc/apt/sources.list.d/cassandra.list', 'deb http://www.apache.org/dist/cassandra/debian 11x main')
append('/etc/apt/sources.list.d/cassandra.list', 'deb-src http://www.apache.org/dist/cassandra/debian 11x main')
run('apt-get update')
def configure_rpc_timeout():
sed(CASSANDRA_CONFIG_FILE, 'rpc_timeout_in_ms: .*', 'rpc_timeout_in_ms: 20000')
@task
@roles('db')
@parallel
def configure():
stop()
configure_rpc_timeout()
configure_endpoint_snitch()
configure_seeds()
configure_listen_address()
configure_topology()
start()
configure_token()
def clean():
run('rm -rf /{etc,var/{log,lib}}/cassandra/*')
@task
@roles('db')
@parallel
def stop():
run('service cassandra stop')
@task
@roles('db')
@parallel
def start():
run('service cassandra start')
@task
@roles('db')
@parallel
def restart():
run('service cassandra restart')
def configure_token():
CASSANDRA_MAX_TOKEN = 170141183460469231731687303715884105728
token_step = CASSANDRA_MAX_TOKEN / len(env.roledefs['db'])
# Get host number
host_number = 0
for host in env.all_hosts:
if env.host in host:
break
host_number += 1
token = host_number * token_step
sed(CASSANDRA_CONFIG_FILE,
'initial_token:.*',
'initial_token: ' + str(token))
run('nodetool move ' + str(token))
def configure_endpoint_snitch():
sed(CASSANDRA_CONFIG_FILE,
'endpoint_snitch: .*',
'endpoint_snitch: PropertyFileSnitch')
def configure_seeds():
sed(CASSANDRA_CONFIG_FILE,
'- seeds: ".*"',
'- seeds: "' + extract_host(env.all_hosts[0]) + '"')
def configure_listen_address():
sed(CASSANDRA_CONFIG_FILE,
'listen_address: .*',
'listen_address: ' + env.host)
sed(CASSANDRA_CONFIG_FILE,
'rpc_address: .*',
'rpc_address: ' + env.host)
def configure_topology():
CASSANDRA_CONFIG_TOPOLOGY = '/etc/cassandra/cassandra-topology.properties'
if exists(CASSANDRA_CONFIG_TOPOLOGY):
run('rm ' + CASSANDRA_CONFIG_TOPOLOGY)
for host in env.all_hosts:
append(CASSANDRA_CONFIG_TOPOLOGY,
extract_host(host) + '=DC1:RAC1')