这是来自High Availability in Cassandra
的后续问题1)假设我们有三个节点N1,N2和N3,我有RF = 3且WC = 3且RC = 1,那么这意味着在写入的情况下我无法处理任何节点故障。 / p>
2)让我们说如果N3(想象它保存数据)失效了,到目前为止,我们将无法以一致性编写数据' 3'。 / p>
问题1:现在如果我启动一个新的Node N4并连接到集群,我仍然无法写入具有一致性3的集群,那么如何让节点N4充当第三个节点?
问题2:我的意思是说我们有7个节点集群,RF = 3,然后如果任何持有副本的节点发生故障,是否有办法让集群中的现有其他节点充当节点持有分区?
答案 0 :(得分:3)
查看文档:
https://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsReplaceNode.html
您想要替换场景中的死节点。 N3应从环中取出并用N4代替。
应该很容易一步一步地遵循该说明。重要的是,如果您通过软件包管理安装节点以在配置新节点之前将其停止并从中清除所有现有数据,缓存和提交日志(通常位于/var/lib/cassandra/*
下)。
此处可以使用nodetool removenode
http://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsRemoveNode.html和https://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsRemoveNode.html中的nodetool repair
从环中删除死节点 - 这会从群集中删除节点(并且您应该确保在消除其数据之前,它不能再回来了)。
请记住,它只会从环中删除死节点并将令牌范围分配给其余节点,但不会自动进行流式传输。删除死节点后,您需要朗姆酒nodetool decommission
。
如果要删除活动节点,可以使用nodetool repair
- 但如上所述,请确保节点不会通过擦除其数据来重新进入群集。
更新:
Cassandra中的节点没有在内部以N1,N2等方式“命名”。节点有一个uuid,他们拥有所谓的令牌范围,他们负责。
如果某个节点出现故障 - 只需在可能的情况下修复它,再次将其联机以将其加入您的群集 - 如果这个时间少于默认的3小时就可以了。否则运行nodetool removenode
。
但是如果节点完全“丢失”并且永远不会返回,请在该死节点上运行nodetool repair
。这要求cassandra将死节点负责的令牌范围分配给其余节点。在运行import keras
import os
import sys
import glob
import argparse
import matplotlib.pyplot as plt
from keras import __version__
from keras.applications.inception_v3 import InceptionV3,
preprocess_input
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import SGD
IM_WIDTH, IM_HEIGHT = 299, 299 #fixed size for InceptionV3
NB_EPOCHS = 3
BAT_SIZE = 32
FC_SIZE = 1024
NB_IV3_LAYERS_TO_FREEZE = 172
def get_nb_files(directory):
"""Get number of files by searching directory recursively"""
if not os.path.exists(directory):
return 0
cnt = 0
for r, dirs, files in os.walk(directory):
for dr in dirs:
cnt += len(glob.glob(os.path.join(r, dr + "/*")))
return cnt
def setup_to_transfer_learn(model, base_model):
"""Freeze all layers and compile the model"""
for layer in base_model.layers:
layer.trainable = False
#model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
#metrics=['accuracy'])
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
def add_new_last_layer(base_model, nb_classes):
"""Add last layer to the convnet
Args:
base_model: keras model excluding top
nb_classes: # of classes
Returns:
new keras model with last layer
"""
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(FC_SIZE, activation='relu')(x) #new FC layer, random init
predictions = Dense(nb_classes, activation='sigmoid')(x)
model = Model(input=base_model.input, output=predictions)
return model
def setup_to_finetune(model):
"""Freeze the bottom NB_IV3_LAYERS and retrain the remaining top
layers.
note: NB_IV3_LAYERS corresponds to the top 2 inception blocks in the
inceptionv3 arch
Args:
model: keras model
"""
for layer in model.layers[:NB_IV3_LAYERS_TO_FREEZE]:
layer.trainable = False
for layer in model.layers[NB_IV3_LAYERS_TO_FREEZE:]:
layer.trainable = True
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
def train(args):
"""Use transfer learning and fine-tuning to train a network on a new
dataset"""
nb_train_samples = get_nb_files(args.train_dir)
nb_classes = len(glob.glob(args.train_dir + "/*"))
nb_val_samples = get_nb_files(args.val_dir)
nb_epoch = int(args.nb_epoch)
batch_size = int(args.batch_size)
# data prep
train_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
test_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
train_generator = train_datagen.flow_from_directory(
args.train_dir,
target_size=(IM_WIDTH, IM_HEIGHT),
batch_size=batch_size,
)
validation_generator = test_datagen.flow_from_directory(
args.val_dir,
target_size=(IM_WIDTH, IM_HEIGHT),
batch_size=batch_size,
)
# setup model
base_model = InceptionV3(weights='imagenet', include_top=False)
#include_top=False excludes final FC layer
model = add_new_last_layer(base_model, nb_classes)
# transfer learning
setup_to_transfer_learn(model, base_model)
history_tl = model.fit_generator(
train_generator,
nb_epoch=nb_epoch,
samples_per_epoch=nb_train_samples,
validation_data=validation_generator,
nb_val_samples=nb_val_samples,
class_weight='auto')
# fine-tuning
setup_to_finetune(model)
history_ft = model.fit_generator(
train_generator,
samples_per_epoch=nb_train_samples,
nb_epoch=nb_epoch,
validation_data=validation_generator,
nb_val_samples=nb_val_samples,
class_weight='auto')
model.save(args.output_model_file)
if args.plot:
plot_training(history_ft)
def plot_training(history):
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'r.')
plt.plot(epochs, val_acc, 'r')
plt.title('Training and validation accuracy')
plt.figure()
plt.plot(epochs, loss, 'r.')
plt.plot(epochs, val_loss, 'r-')
plt.title('Training and validation loss')
plt.show()
if __name__=="__main__":
a = argparse.ArgumentParser()
a.add_argument("--train_dir")
a.add_argument("--val_dir")
a.add_argument("--nb_epoch", default=NB_EPOCHS)
a.add_argument("--batch_size", default=BAT_SIZE)
a.add_argument("--output_model_file", default="inceptionv3-ft.model")
a.add_argument("--plot", action="store_true")
args = a.parse_args()
if args.train_dir is None or args.val_dir is None:
a.print_help()
sys.exit(1)
if (not os.path.exists(args.train_dir)) or (not
os.path.exists(args.val_dir)):
print("directories do not exist")
sys.exit(1)
train(args)
之后,节点将流式传输丢失的数据。之后,您的群集现在将减少一个节点,因此它将是六个节点。
答案 1 :(得分:2)
假设您有一个7节点集群。 N1,N2,N3,...,N7。假设你有一个数据。这有RF = 3,写一致性= 2,读一致性= 2.假设节点N1,N2,N3保持数据。如果任何此节点发生故障,只要满足读写操作的一致性级别,集群就会完全正常,并且数据读/写操作不会受到影响。
假设您有数据。这有RF = 3,写一致性= 3,读一致性= 3.假设节点N1,N2,N3保持数据。如果任何此节点发生故障,操作将失败,因为不满足一致性级别。
现在你可以做两件事,如果N1,N2,N3中的任何一个下降:
1)您可以替换节点。在这种情况下,新替换的节点将像旧的死节点一样
2)您可以手动添加新节点N8并删除旧的死节点N3。在这种情况下,Cassandra将把它的分离者分配到戒指中并调整大小。